Проблема с чтением последней строки из файла.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Есть 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?
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

Всегда пишу до нееофа и всё работает. Но в теле ровно один оператор файлового ввода, а не два цепных.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
L.A.V.
Сообщения: 20
Зарегистрирован: 16 авг 2009, 23:37
Откуда: Солнечный Крым
Контактная информация:

Проблема не в строке(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;
        }
    }
хотя уверен есть еще множество способов решения, может, даже более правильных чем этот. :)
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

&quot писал(а):Проблема не в строке(file_in >> start_pop >> term; ), а в том - где стоит эта строка.
В твоем случае: после чтения последней строки (с помощью file_in >> start_pop >> term; ) файла data.dat поток file_in уже указывает на конец файла, поэтому условие цикла срабатывает и в итоге не происходит повторного захода в цикл while, следовательно не происходит вычислений, и следовательно последняя строка не допишется в файл result.dat.
Молодец, заметил. Я пропустил, наверное потому, что сделать такой глюк - это надо ещё умудриться.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
&quot писал(а):хотя уверен есть еще множество способов решения
Наприемер так:

Код: Выделить всё

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;        
}
&quot писал(а):может, даже более правильных чем этот.
Мой вариант возможно хуже, но точно не лучше.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

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() по-моему лучший вариант, в связи с чем, как-то даже и не подумал о возможности другой реализации.
Еще раз спасибо, намотаю на ус :)
Ответить