fstream не пишет в файл

У меня проблема с тем, что fstream не записывает в мой файл, когда он находится в определенном месте. В следующем коде, когда закомментированная строка раскомментирована, файл записывается, однако, когда она закомментирована, файл вообще не записывается. Я добавил кучу вывода консоли, и он говорит, что оба вывода вокруг «outputFile ‹‹ newWord ‹‹ endl;» завершены, но файл фактически никогда не записывается.

void write_index( string newWord )
{
fstream outputFile( "H:\\newword.txt", ios::app );
int same = 0;
string currWord;
currWord.resize(5);
//outputFile << newWord << endl;
while( !outputFile.eof() )
{
    getline( outputFile, currWord );
    cout << "Checking if " << newWord << "is the same as " << currWord << endl;
    if( newWord == currWord )
    {
        cout << "It is the same" << endl;
        same = 1;
        break;
    }
}
if( same != 1 )
{
    cout << "Writing " << newWord << "to file" << endl;
    outputFile << newWord << endl;
    cout << "Done writing" << endl;
}
outputFile.close();

}


person user1560249    schedule 27.02.2013    source источник
comment
ios::app: Все операции вывода выполняются в конце файла, добавляя содержимое к текущему содержимому файла. Этот флаг можно использовать только в потоках, открытых только для операций вывода. Итак, как именно getline будет работать с файлом только для вывода?   -  person paxdiablo    schedule 27.02.2013
comment
Я не знал об этом, но это имеет смысл, есть ли альтернатива чтению из файла перед добавлением к нему? Я пытаюсь проверить все строки над строкой, которая должна быть написана, чтобы проверить, есть ли равные строки, и если они есть, строка не написана.   -  person user1560249    schedule 27.02.2013
comment
Откройте его для чтения/записи, затем просканируйте его в поисках дубликата. Если не найдено, просто установите указатель файла в конец файла и напишите его. К сожалению, будучи больше парнем C, я знаю о fopen(?,"a+") и fseek, но не об их эквивалентах C++.   -  person paxdiablo    schedule 27.02.2013
comment
Ну, я возился, и у меня это сработало. Я заставил приведенную выше функцию возвращать то же самое, что и целое число, а затем поместил измененное условное выражение обратно в основную функцию сразу после вызова функции, и, похоже, она работает. Так что теперь функция write_index читает только с использованием ifstream, а я только что открыл ofstream в основной функции.   -  person user1560249    schedule 27.02.2013
comment
getline( outputFile,? Получить? выход? Это подозрительно!   -  person Johnsyweb    schedule 27.02.2013


Ответы (1)


Я несколько уверен, что вы ищете что-то в этом роде:

void write_index( const string& newWord )
{
    fstream outputFile( "H:\\newword.txt", ios::in);
    bool same = false;

    if (outputFile)
    {
        string currWord;
        while (getline(outputFile, currWord))
        {
            cout << "Checking if " << newWord << " is the same as " << currWord << endl;
            same = (newWord == currWord);
            if (same)
            {
                cout << "It is the same" << endl;
                break;
            }
        }
    }

    if (!same)
    {
        outputFile.close();
        outputFile.open("H:\\newword.txt", ios::app);

        cout << "Writing " << newWord << "to file" << endl;
        outputFile << newWord << endl;
        cout << "Done writing" << endl;
    }

    outputFile.close();
}

Есть лучшие способы сделать это, но это, вероятно, будет достойным местом для начала.

person WhozCraig    schedule 27.02.2013
comment
Я думаю, вы можете захотеть app при втором открытии, так как в противном случае вы потеряете все данные, которые в данный момент находятся в файле. И хотя я не гуру С++, нужно ли закрывать выходной файл перед повторным открытием? - person paxdiablo; 27.02.2013