Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Си. Проблема со считыванием с файла и ф-й strtok 
V
    Опции темы
Асоишница
Дата 24.2.2013, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.3.2012

Репутация: нет
Всего: нет



Дан файл(прикреплён)- там внизу файла не распознаёт русский по вроде. там Энтропия: 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);//закрываем исходный файл
}



Это сообщение отредактировал(а) Асоишница - 24.2.2013, 23:42

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  txt32.txt 1,79 Kb
PM MAIL   Вверх
Zmaster555
Дата 25.2.2013, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 14.1.2013

Репутация: нет
Всего: нет



Ох, ну и намудрила же ты тут, сколько всего лишнего.

Код

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

Это сообщение отредактировал(а) Zmaster555 - 25.2.2013, 03:04
PM MAIL   Вверх
Асоишница
  Дата 25.2.2013, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.3.2012

Репутация: нет
Всего: нет



Zmaster555, всё работает, как надо, всё понятно!!!и имя файла норм) спасибо большое, а то намучалась я с этой strtok......
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.