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 при второто отваряне, тъй като в противен случай губите всички данни в момента във файла. И въпреки че не съм C++ гуру, трябва ли да затворите изходния файл, преди да го отворите отново? - person paxdiablo; 27.02.2013