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

  • Автор темы IIaBeJl
  • Дата начала
I

IIaBeJl

#1
Вот у меня такая проблема. Есть файл... В нём 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-ая строка сама когда захочет добавляется...((((
 
I

IIaBeJl

#5
в каких двух случаях? приведи код вывода
Код:
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
И тоже самое... :)
 

Kmet

Java Team
25.05.2006
1 036
8
#6
=)
прочитай про zero-terminated string

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

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

IIaBeJl

#7
=)
прочитай про 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 байту... Ну ты и сам наверно это знаеш :)

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

Ockonal

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