Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Странное чтение данных из файла
Форум программистов > Системное программирование > C, С++ и С Builder > Borland C++ Builder & Kylix
IIaBeJl
Вот у меня такая проблема. Есть файл... В нём 5 строк(строки разделяются "\n"). Мне надо считать этот файл в переменную char или AnsiString... Вот как я это делаю:
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-ая строка сама когда захочет добавляется...((((
Kmet
а закрывать строку \0 кто будет?
IIaBeJl
Цитата(Kmet @ 28:07:2008, 15:44 ) *
а закрывать строку \0 кто будет?


Всё равно не помогает... подобавлял в двух случаях и ничего не изменилось dry.gif
Kmet
в каких двух случаях? приведи код вывода
IIaBeJl
Цитата(Kmet @ 29:07:2008, 08:24 ) *
в каких двух случаях? приведи код вывода


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


И тоже самое... sad.gif
Kmet
=)
прочитай про zero-terminated string

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

int  i = fread(computers, fileinfo.st_size, 1, stream);
computers[i] = 0;
IIaBeJl
Цитата(Kmet @ 29:07:2008, 16:45 ) *
=)
прочитай про zero-terminated string

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

int  i = fread(computers, fileinfo.st_size, 1, stream);
computers[i] = 0;

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

Спасибо что подтолкнул на правильное решение проблемы... smile.gif
Ockonal
>char computers[2000]; //создаю переменную char
Вообще, почему считываешь именно в массив такого размера?
Тут желательно узнать размер файла и динамически выделить память для него под массив, иначе будут утечки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.