Странное чтение данных из файла

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем IIaBeJl, 28 июл 2008.

  1. IIaBeJl

    IIaBeJl Гость

    Вот у меня такая проблема. Есть файл... В нём 5 строк(строки разделяются "\n"). Мне надо считать этот файл в переменную char или AnsiString... Вот как я это делаю:
    Код (Text):
    FILE *stream; //создаю переменную файла   
    char computers[2000]; //создаю переменную char   
    struct stat fileinfo; //структура для записи информации о файле    
    stat("E:\\lopcbtos.dll", &fileinfo);//запись инфы о файле в структуру  
    stream = fopen("E:\\lopcbtos.dll", "r+");    
    fread(computers, fileinfo.st_size, 1, stream); // c с мощью fileinfo.st_size опеределяется размер файла в байтах  
    fclose(stream); //закрываю файл  
    ShowMessage(computers); // вывожу переменную computers
    И вот в чём загвоздка: как-то странно получается, иногда нормально 5 строк выводятся, а иногда добавляется шестая строка с случайным набором символов(до 7 символов), хотя получаемый через fileinfo.st_size размер файла не меняется... и вообще значит размер файла не меняется, а 6-ая строка сама когда захочет добавляется...((((
     
  2. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    а закрывать строку \0 кто будет?
     
  3. IIaBeJl

    IIaBeJl Гость

    Всё равно не помогает... подобавлял в двух случаях и ничего не изменилось ;)
     
  4. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    в каких двух случаях? приведи код вывода
     
  5. IIaBeJl

    IIaBeJl Гость

    Код (Text):
    FILE *stream; //создаю переменную файла   
    char computers[2000]; //создаю переменную char   
    struct stat fileinfo; //структура для записи информации о файле    
    stat("E:\\lopcbtos.dll\0", &fileinfo);//запись инфы о файле в структуру    
    stream = fopen("E:\\lopcbtos.dll\0", "r+");  
    fread(computers, fileinfo.st_size, 1, stream); // c с мощью fileinfo.st_size опеределяется размер файла в байтах  
    fclose(stream); //закрываю файл  
    ShowMessage(computers); // вывожу переменную computers
    И тоже самое... :)
     
  6. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    =)
    прочитай про zero-terminated string

    в твоем случае надо что то типа такого

    Код (Text):
    int i = fread(computers, fileinfo.st_size, 1, stream);
    computers[i] = 0;
     
  7. IIaBeJl

    IIaBeJl Гость

    Прочитал... Правда не много нашёл, только то что Zero Terminated String - Строка с завершающим нулем, я понял что ты этим кодом сделал, fread возвращает кол-во прочитанных символов, а ты на последний символ присвоил 0 - конец строки...
    Только одно НО, твой код не работает, i всегда равняется 0. Потому что надо местами кое-что поменять fread(computers, 1, fileinfo.st_size, stream);
    Вот так работает... Потому что мы считываем fileinfo.st_size символов по 1 байту... Ну ты и сам наверно это знаеш :)

    Спасибо что подтолкнул на правильное решение проблемы... :)
     
  8. Ockonal

    Ockonal Гость

    >char computers[2000]; //создаю переменную char
    Вообще, почему считываешь именно в массив такого размера?
    Тут желательно узнать размер файла и динамически выделить память для него под массив, иначе будут утечки.
     
Загрузка...

Поделиться этой страницей