Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2012, 16:30   #1
CoLT
 
Регистрация: 23.09.2012
Сообщений: 7
По умолчанию Проблема с программой чтения строк файла.

Здравствуйте. Я недавно начал изучать программирование C++ по книге.
Там приводится листинг программы, которая должна открыть файл, считать его строки и вывести их на экран. Вот листинг
Код:
#include <fstream>
#include <vector>
using namespace std;
int main() {
	char buff[4];
	vector<string> s;
	ifstream infile;
	infile.open("Text");
	while(1) {
		infile.getline(buff, sizeof(buff));
		if(infile.eof()) break;
		s.push_back(buff);
	}
	sort(s.begin(),s.end());
	for(int i=0; i<s.size(); i++)
		cout << s[i] << endl;
	infile.close();
	system("pause");
}
Но почему-то цикл while не прекращается, а продолжается бесконечно (проверил вставкой в цикл cout << 1; так он эту единицу мне писал, пока я программу не закрыл). Я подозреваю, что что-то не так с функцией eof() (книжка 2005 года, мог измениться язык).
Вобщем подскажите пожалуйста)))

В файле Text записано "text"

Последний раз редактировалось CoLT; 23.09.2012 в 16:31. Причина: Дописал
CoLT вне форума Ответить с цитированием
Старый 23.09.2012, 16:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
	while(!infile.eof()) {
		infile.getline(buff, sizeof(buff));
		s.push_back(buff);
	}
Не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.09.2012, 16:56   #3
CoLT
 
Регистрация: 23.09.2012
Сообщений: 7
По умолчанию

Нет, всё равно не выходит, цикл не завершается
CoLT вне форума Ответить с цитированием
Старый 23.09.2012, 16:57   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Файл можешь приложить?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.09.2012, 17:07   #5
CoLT
 
Регистрация: 23.09.2012
Сообщений: 7
По умолчанию

Прилагаю файл
Вложения
Тип файла: txt Text.txt (4 байт, 8 просмотров)
CoLT вне форума Ответить с цитированием
Старый 23.09.2012, 18:17   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
infile.open("Text");
А файл у тебя "Text.txt"
Ничего не смущает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.09.2012, 20:08   #7
CoLT
 
Регистрация: 23.09.2012
Сообщений: 7
По умолчанию

Ок, я дописал расширение, но всё равно глухо... Может дело в кодировке?
CoLT вне форума Ответить с цитированием
Старый 23.09.2012, 22:13   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не в курсе что ты там делаешь, но у меня вот такое работает:
Код:
	char buff[4];
	vector<string> s;
	ifstream infile("d:\\1\\Text.txt",ios::binary);
	while(!infile.eof()) {
		infile.read(buff,4);
		s.push_back(buff);
	}
	infile.close();
	system("pause");
	return 0;
Рули отладчиком, где-то ты еще что-то не учел.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.09.2012, 11:43   #9
CoLT
 
Регистрация: 23.09.2012
Сообщений: 7
По умолчанию

У меня заработало вот такое
Код:
infile.open ("Text.txt");
while(1) {
		infile.read(buff, sizeof(buff));
		if(infile.eof()) break;
		s.push_back(buff);
	}
	sort (s.begin(), s.end());
	for(int i=0; i<s.size(); i++)
		cout << s[i] << endl;
	infile.close();
	system("pause");
	return 0;
Но после "text" пишутся всякие кракозябры. В чём может быть проблема?
И почему не работает функция getline() ?
CoLT вне форума Ответить с цитированием
Старый 24.09.2012, 12:15   #10
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

кракозябры потому, что вы выделили массив символов на 4, и когда вы выводите через cout<<, cout ищет завершающий символ ( который \0 ), не находит, и идет дальше по памяти. то есть по сути у вас тут выход за границы массива. Для того чтобы такой дребедени не происходило, Вам надо выделить на 1 символ больше и явно сделать его \0 вот так
Код:
    buff[strlen(buff)-1] = '\0'; // или  buff[strlen(buff)-1] = 0;
и при чтении выдавать на 1 символ меньше
Код:
infile.getline(buff, strlen(buff)-1);
Разумеется, я могу быть не прав, потому что на С++ не программировал уже полгода, но, все-таки, проверьте, мне самому интересно
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
какой программой проверить скорость чтения HDD? contin Компьютерное железо 2 18.05.2012 15:46
функция чтения из файла с++ Dolilla Помощь студентам 2 26.12.2011 18:54
[Проблема]Создание нового типа файла и ассоциация его с программой Человек_Борща Общие вопросы Delphi 5 07.03.2011 21:35
Копирование файлов без чтения строк. Alex Cones Общие вопросы Delphi 6 18.04.2009 11:07