Страница 1 из 1
Проблема с чтением последней строки из файла.
Добавлено: 22 окт 2009, 15:21
Dragon
Есть 2 файла:
- data.dat (в каждой строке по 2 значения:
10 1
20 10
1 15
3 4
и т.д.).
- result.dat (входящие данные и результат вычислений).
Проблема с чтением последних данных в переменные из файла data.dat:
Код: Выделить всё
int start_pop, term, end_pop;
ifstream file_in;
ofstream file_out;
file_in.open("data.dat");
file_out.open("result.dat");
file_in >> start_pop >> term;
while(!file_in.eof())
{
for(int i = 1; i <= term; i++)
{
//вычисления
}
file_out << start_pop << " " << term << " " << end_pop << endl;
//Проблема в этой строке:
file_in >> start_pop >> term;
}
Как вариант, можно оставлять в фйле пустую строку, тогда все будет ОК. Но можно ли считать последнюю переменную до маркера eof?
Re: Проблема с чтением последней строки из файла.
Добавлено: 23 окт 2009, 05:40
atavin-ta
Всегда пишу до нееофа и всё работает. Но в теле ровно один оператор файлового ввода, а не два цепных.
Re: Проблема с чтением последней строки из файла.
Добавлено: 23 окт 2009, 16:08
L.A.V.
Проблема не в строке(file_in >> start_pop >> term; ), а в том - где стоит эта строка.
В твоем случае: после чтения последней строки (с помощью file_in >> start_pop >> term; ) файла data.dat поток file_in уже указывает на конец файла, поэтому условие цикла срабатывает и в итоге не происходит повторного захода в цикл while, следовательно не происходит вычислений, и следовательно последняя строка не допишется в файл result.dat.
могу предложть следующий тип решения проблемы:
Код: Выделить всё
...
file_in.open("data.dat");
file_out.open("result.dat");
//в этом месте проблем с этой строкой нет )
while(file_in >> start_pop >> term)
{
for(int i = 1; i <= term; i++)
{
//вычисления
}
file_out << start_pop << " " << term << " " << end_pop << endl;
}
}
хотя уверен есть еще множество способов решения, может, даже более правильных чем этот.

Re: Проблема с чтением последней строки из файла.
Добавлено: 26 окт 2009, 04:30
atavin-ta
" писал(а):Проблема не в строке(file_in >> start_pop >> term; ), а в том - где стоит эта строка.
В твоем случае: после чтения последней строки (с помощью file_in >> start_pop >> term; ) файла data.dat поток file_in уже указывает на конец файла, поэтому условие цикла срабатывает и в итоге не происходит повторного захода в цикл while, следовательно не происходит вычислений, и следовательно последняя строка не допишется в файл result.dat.
Молодец, заметил. Я пропустил, наверное потому, что сделать такой глюк - это надо ещё умудриться.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
" писал(а):хотя уверен есть еще множество способов решения
Наприемер так:
Код: Выделить всё
int i;
int start_pop, term, end_pop;
ifstream file_in;ofstream file_out;
file_in.open("data.dat");
file_out.open("result.dat");
while(!file_in.eof())
{
file_in >> start_pop >> term;
for(i = 1; i <= term; i++)
{
//вычисления
}
file_out << start_pop << " " << term << " " << end_pop << endl;
}
" писал(а):может, даже более правильных чем этот.
Мой вариант возможно хуже, но точно не лучше.
Re: Проблема с чтением последней строки из файла.
Добавлено: 26 окт 2009, 10:33
Dragon
L.A.V. писал(а):
могу предложть следующий тип решения проблемы:
Код: Выделить всё
...
file_in.open("data.dat");
file_out.open("result.dat");
//в этом месте проблем с этой строкой нет )
while(file_in >> start_pop >> term)
{
for(int i = 1; i <= term; i++)
{
//вычисления
}
file_out << start_pop << " " << term << " " << end_pop << endl;
}
}
хотя уверен есть еще множество способов решения, может, даже более правильных чем этот.
Спасибо, работает.
В основном с файлами как с символьными данными работал, а когда чтение посимвольное, то eof() по-моему лучший вариант, в связи с чем, как-то даже и не подумал о возможности другой реализации.
Еще раз спасибо, намотаю на ус
