2011-12-14 3 views
0

Im работает над программой из двух частей, которая использует кодировщик, кодирует текстовый файл, а затем декодер для декодирования текстового файла. Однако я не могу заставить мой декодер читать весь текстовый файл, он просто читает первую строку. Как это исправить, я играл с петлями, но это не помогает мне.C++ текстовый декодер принимает только одну строку из текстового файла

#include <fstream> 
#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    ifstream fin; 
    ofstream fout; 
    string lineFromFile; 
    fin.open("secret.txt"); 
    if (!fin.good()) throw "I/O error"; 
    fout.open("secret.txt", ios::app); 
    if (!fout.good()) throw "I/O error"; 

    while (fin.good()) 
    { 
     getline(fin, lineFromFile); 
     for (int i = 0; i < lineFromFile.length(); i++) // for each char in the string... 
      lineFromFile[i]--; // bump the ASCII code by 1 
     fout << lineFromFile << endl;  
    }//while 

    fin.close(); 
    fout.close(); 
    return 0; 
} 

ответ

1

Вы закрываете поток на первой итерации (т. Е. После прочтения первой строки). Затем вы открываете выходной поток до пишите первая строка. Только , затем, вы доходите до конца цикла while, когда fin.good() не может быть правдой, так как вы закрыли fin.

Цикл должен содержать только чтение и письмо. Открытие выполняется до цикла, закрытие завершено.

Дополнительное предложение: Используйте правильный отступ, он помогает понять поток управления.

+3

Именно поэтому хорошее форматирование имеет значение. –

+0

ok Я внесла некоторые изменения, но все равно не отправил весь текстовый файл – David

1

Я думаю, проблема может заключаться в том, что вы читаете и записываете из того же файла: secret.txt. Я не знаю, что такое ожидаемое поведение, но когда я запускал код, он был бесконечным, что имеет смысл при добавлении.

Попробуйте изменить поток вывода, fout, на другое имя файла.

Цикл while, который в настоящее время обрабатывает файл, обработает окончательное недопустимое чтение, поскольку вы не проверяете, был ли getline() успешным до состояния цикла. Я хотел бы предложить изменения к:

for (;;) 
{ 
    getline(fin, lineFromFile); 
    if (!fin.good()) 
    { 
     break; 
    } 
    for (int i = 0; i < lineFromFile.length(); i++) 
     lineFromFile[i]--; 
    fout << lineFromFile << endl;  
} 
1

Возможно, потому, что другой дескриптор файла, fout, обращается к файлу, к которому fin привязанный, fin закрыт, как побочный эффект. Либо это, либо потому, что к файлу добавляется fout, указатель файла указывается в конце файла, и потому, потому что больше нет ввода для чтения, цикл заканчивается. (Это гипотезы, я недостаточно осведомлен о специфике C++ IO, чтобы окончательно сказать, что происходит.)

Если вы хотите заменить исходный файл кодированной версией, я рекомендую установить файл привязан к fout во временный файл на весь указанный выше код, закрыв оба fin и fout, а затем скопировав файл, связанный с fout, над файлом, связанным с fin.

В противном случае просто привяжите fout к другому имени файла, кроме fin, например "encoded.txt".

+1

Гош, я не могу поверить, что пропустил этот ... – DevSolar

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