Ох, ну и намудрила же ты тут, сколько всего лишнего.
| Код | #include <stdio.h> #include <conio.h> #include <math.h> #include <locale.h> #include <stdlib.h> #include <string.h>
int main() { setlocale(LC_ALL, "Russian"); char IN[100], name[15], siz[15], str[40], *sym; double mas[2][256]={0}, ent; int size, i=0; FILE *f; printf("Введите путь к исследуемому файлу:\n"); scanf("%s", IN);
if((f=fopen(IN, "rb"))==NULL) { printf("Файл не может быть открыт.\n"); exit(1); }
fgets(name, 20, f); //Считываем имя fgets(siz, 20, f); //Считываем размер sscanf(siz, "%d", &size); //Конвертируем размер
fgets(str, 40, f); //Считываем пустую строку
int fl=0; while(fl==0) //Выполнять пока не встретим пустую строку { fgets(str, 40, f); if(strcmp(str, "\r\n")!=0) //Встретили ли пустую строку? { sym=strtok(str," \t"); //Считывание кода mas[0][i]=atof(sym); sym=strtok(NULL," \t"); //Считывание вероятности mas[1][i]=atof(sym); i++; } else fl=1; //Встетили пустую строку, установить флаг }
fgets(str, 40, f); //Считываем строку с энтропией sym=strtok(str, ":"); sym=strtok(NULL, ":"); //Отделяем число энтропии (вторая лексема) ent=atof(sym);
printf("%s\t%d\r\n\r\n", name, size); //Выводим имя, размер for(i=0; mas[1][i]!=0; i++) //Выводим таблицу printf("%*.*f\t%.*f\r\n", 3, 0, mas[0][i], 20, mas[1][i]); printf("\r\n%s%.*f", "Энтропия: ", 10, ent); //Выводим энтропию
getch(); fclose(f);
return 1; }
|
Нормальный, оптимальный, рабочий код, разделил код на маленькие удобно читаемые блоки, так что, думаю разобраться будет не проблема...НО! В переменную name из потока считывается какой-то мусор, как от него избавиться я так и не сообразил. Хотя может это только у меня так. Число энтропии я отделил все той же strtok. Если будут вопросы, с удовольствием отвечу. |