Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Си. Проблема со считыванием с файла и ф-й strtok


Автор: Асоишница 24.2.2013, 23:17
Дан файл(прикреплён)- там внизу файла не распознаёт русский по вроде. там Энтропия: 4,6040755441
колонка слева- код символа, справа- вероятность его в файле(было получено ранее). 
Надо извлечь название, размер(15511), коды символов и их частоту(в двумерный массив) и энтропию. 
с первыми двумя проблем нет, а вот с записью в двумерный массив....использую strtok();но не могу записать лексемы по-отдельности, преобразовав их в тип int для кодов и double для вероятности. пробовала sscanf() и atof()- безрезультатно. Но на лексемы делит(пробовада выводить). И ещё, как порациональнее отделить энтропию, т.е. последнюю лексему?
Код

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


void main()
{
setlocale(LC_ALL, "Russian");
double mas[2][256]={0},buf=0,ent=0;
int i=0,j=0,ch=0,size, k=0, n=0;
char IN[100],OUT[100], str[40], name[10], siz[15], entr[25], *sym, text[30];
FILE *f;
printf("Введите путь к исследуемому файлу\n");
scanf("%s",IN);

if((f=fopen(IN,"rb"))==NULL){//открываем исходный файл для чтения
        printf("Файл не может быть открыт.\n");
        exit(1);}
while(feof(f)==0){ 
if(k==0) {fgets(name, 20, f); k++;}
if(k==1) {fgets(siz, 20, f); k++;}
sscanf(siz, "%d", &size);
while(k==2 && !feof(f)){    
    fgets(str, 40, f);
    sym= strtok(str," \t");
    while (sym != NULL)
  {
     if(n==0){ sscanf(str, "%d", &mas[0][i]);n=1;}//номер символа
      if(n==1){ sscanf(str, "%f", &mas[1][i]); n=0;}//частота
        sym = strtok (NULL, "\t");
    } 
    i++;
    
        
}

printf("%s  %d\n ", name, size);
for(i=0; mas[1][i]!=0; i++){ printf("%d\t  %d\n ", mas[0][i], mas[1][i]);}
//printf("%.20f", ent);
getch();
}
fclose(f);//закрываем исходный файл
}


Автор: Zmaster555 25.2.2013, 02:56
Ох, ну и намудрила же ты тут, сколько всего лишнего.

Код

#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. Если будут вопросы, с удовольствием отвечу.

Автор: Асоишница 25.2.2013, 16:03
Zmaster555, всё работает, как надо, всё понятно!!!и имя файла норм) спасибо большое, а то намучалась я с этой strtok......

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)