2013-03-11 2 views
-1

My Issue включает чтение целых чисел из текстового файла, сохранение их в массив и последующее копирование массива в новый .txt-файл.Невозможно получить последний int из файла .txt

Так есть файл «krol.txt»

2 4 
3 7 
3 13 
2 4 
3 1 

Проблема заключается в том, что она никогда не сохранить последний «1» из входного файла .txt. Понятия не имею почему. Я думаю, что о EOF о последнем персонаже в файле, но почему он работает так? Может кто-нибудь мне помочь?

Это мой код:

#include <iostream> 
#include <fstream> 
#include <cstdlib> 

using namespace std; 

int main() { 
    ofstream outFile; 
    ifstream fin; 
    fin.open("krol.txt"); 
    int l=0; 
    char ch; 

    while (fin.good()) { 
     fin.get(ch); 

     if(ch=='\n') l++; 
    } 
    fin.close(); 

    fin.open("krol.txt"); 
    int temp[l][2]; 
    int savel=l; 
    l=0; 
    int i=0; 

    while (fin >> (temp[l][i])) { 
     i++; 
     if(i==2) { 
       i=0; 
       l++; 
     } 
    } 

    outFile.open("save.txt"); 

    for (int i=0, j=0;j<savel;i++) { 
     if (i==2) { 
      i=0; j++; 
     } 
     outFile << temp[j][i]; 
    } 

    outFile.close(); 
    system("PAUSE"); 
    return 0; 
} 
+0

Действительно ли это * компилируется? 'int temp [l] [2];' (это '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

ответ

2

Это экономит все номера в порядке. Проблема в том, что она хранит дополнительные номера в save.txt.

С

while (fin.good()){ 
... 
} 

считать последнюю строку дважды. Это дает вам два дополнительных неинициализированныхint s. Эти два int s могут отображаться как любое целое число.

Я вижу две проблемы. Ваш первый цикл, чтобы получить количество строк должно быть больше как

while (fin.get(ch)){ 
    if (ch == '\n') 
     l++; 
} 

Если последняя строка не имеет окончательного \n, вы могли бы закончить с одной линией меньше, чем вам нужно.

И цикл производства может быть упрощен до

for (int j = 0; j < savel; j++){ 
    for (int i = 0; i < 2; i++) 
     outFile << temp[j][i] << ' '; 
} 

И, наконец, если вы используете , вы должны рассмотреть возможность использования std::vector вместо простых массивов. Тогда вам не нужно предварительно распределять свой массив и читать файл за один проход.

+0

save.txt сходит с ума и сэкономит '2 4 3 7 3 13 2 4 3 1 2293083 0'. для чего стоят 2 последних номера? Что это за фигня. –

+1

@FilipBartuzi См. Обновленный ответ. –

0

Там может быть 4 «\ п» символы в этом файле вы считали, что?

Смежные вопросы