• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

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

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

Well-known member
25.05.2006
904
8
BIT
0
в каких двух случаях? приведи код вывода
 
I

IIaBeJl

в каких двух случаях? приведи код вывода

Код:
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

Well-known member
25.05.2006
904
8
BIT
0
=)
прочитай про zero-terminated string

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

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

IIaBeJl

=)
прочитай про 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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!