LINUX.ORG.RU

Функция read() в С++


0

1

При чтении файла «head.h» в программе на С++: #include <iostream> #include <fstream> using namespace std;

int main(void) { char s[2000]; ifstream file; file.open(«head.h»);

file.read(reinterpret_cast<char*>(s),sizeof(s));

cout << s << endl;

return 0; } каждый раз выдает, после распечатки файла:«head.h», дополнительно какой-то мусор. Что-то с функцией read()? Откуда может быть мусор?


> Откуда может быть мусор?

file.read(reinterpret_cast<char*>(s),sizeof(s));

sizeof(s)

// К.О.

anonymous
()
Ответ на: комментарий от uzbl

s[1999] = 0; /* те, отмечаем конец строки */

cout << s << endl; /* и уже потом её выводим, дабы не печатать что попало из heap */

Ну и если файлик будет >2000б тоже нехорошо.

uzbl
()
Ответ на: комментарий от uzbl

> Перечитай потс.

Да там и нечего читать. Должно быть s[размер_файла] = 0; или все занулить в начале.

anonymous
()
Ответ на: комментарий от can

> Нуль в конце строки добавил: s[strlen(s)] = 0; — ничего не изменилось...

Потому что strlen(s) != последний в массиве.

anonymous
()
Ответ на: комментарий от anonymous

Pardon! strlen() выдает по определению реальное число символов в массиве.... без последнего нуля.

can
() автор топика
Ответ на: комментарий от anonymous

>или все занулить в начале
Лишняя работа.

Должно быть s[размер_файла]

Да, но надо жэ пошагово объяснить в чём проблема (а она в отсутствии завершающего нуля).

uzbl
()
Ответ на: комментарий от can

> Pardon! strlen() выдает по определению реальное число символов в массиве.... без последнего нуля.

И ты наверняка знаешь, где находится первый нуль с ячейки &s?

anonymous
()
Ответ на: комментарий от uzbl

> Потому, что в массиве нет нулика, мой друк.

Я про то и говорю.

anonymous
()
Ответ на: комментарий от can

s[strlen(s)] = 0; - это бред сивой кобылы, как a = a; или if (a == 1) a = 1;

anonymous
()
Ответ на: комментарий от uzbl

В таком случае как определить реальный размер считанного файла для добавления терминального нуля в массив ?

can
() автор топика
Ответ на: комментарий от can

> Pardon! strlen() выдает по определению реальное число символов в массиве...

И стирает тебе носки, да.


LamerOk ★★★★★
()

read при чтении файла не добавляет нулевой символ в конец, ибо она не знает что такое строка и просто считывает n байт из файла в буфер. Вариантов решения тут аж два:

#1:

int main(void)
{
char s[2000];
ifstream file;
file.open("head.h");

file.seekg (0, ios::end);
int len = file.tellg();
file.seekg(0, ios::beg);

file.read(s, len);
s[len] = '\0';
cout << s << endl;
return 0;
}
#2:
int main(void)
{
char s[2000] = {0};
ifstream file;
file.open("head.h");
file.read(s,sizeof(s));
cout << s << endl;
return 0;
}

Fawkes
()

char s[1231231231] = {0};

bk_ ★★
()
Ответ на: комментарий от Fawkes

как бы read надо делать не на всю длину s а на sizeof(s)-1, шоб хотя б один нолик то остался? А то будет как в прошлый раз;-)

AIv ★★★★★
()

Спасибо за тред, это правда смешно.

geekless ★★
()
Ответ на: комментарий от uzbl

Ну и вапще, не в хипе, а на стеке. // никто даже не заметил, не торт(

uzbl
()
Ответ на: комментарий от AIv

Я увидел что опечатался когда уже отправил - думал никто не заметит :)

Fawkes
()
Ответ на: комментарий от Fawkes

> #1:

А ситуации, когда размер файла будет больше размера буфера, конечно же быть не может... Идите и дорабатывайте до пригодного к использованию состояния.

anonymous
()
Ответ на: комментарий от anonymous

Насколько я вижу, исходный вопрос был в том, откуда берется «мусор» при выводе прочитанной строки, а не что будет если содержимое файла не влезет в буфер. Но специально для анонимуса вот исправленный вариант:

#include <iostream>
#include <fstream>

int main (int argc, char * const argv[])
{
	std::ifstream file("head.h");
	if (file.fail())
	{
		std::cerr << "Cann't read file\n";
		return -1;
	}
	
	file.seekg (0, std::ios::end);
	int len = file.tellg();
	file.seekg(0, std::ios::beg);
	
	char *s = new char[len+1];
	file.read(s, len);
	s[len] = '\0';
	
	std::cout << s << '\n';
	
	delete [] s;
	return 0;
}

Fawkes
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.