2013-02-27 7 views
1

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

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(); 

}

+3

«** ios :: app: ** Все выходные операции выполняются в конце файла, добавляя содержимое к текущему содержимому файла - этот флаг может использоваться только в потоках, открытых для операций с выходом ». Итак, как именно 'getline' будет работать в файле только для вывода? – paxdiablo

+0

Я не знал об этом, но это имеет смысл, есть ли альтернатива для чтения из файла перед добавлением к нему? Я пытаюсь проверить все строки над строкой, которая должна быть записана, чтобы проверить, есть ли равные строки, а если есть, строка не написана. – user1560249

+0

Откройте его для чтения/записи, затем сканируйте его, ища дубликат. Если не найден, просто установите указатель на файл в конец файла и напишите его. К сожалению, будучи больше C-пар, я знаю о 'fopen (?," A + ")' и 'fseek', но не эквивалентах C++ с верхней части головы. – paxdiablo

ответ

2

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

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(); 
} 

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

+0

Думаю, вам может понадобиться 'app' во втором открытии, так как вы в противном случае потеряете все данные, находящиеся в данный момент в файле. Я не гуру C++, вам нужно закрыть выходной файл перед повторным открытием? – paxdiablo

+0

@paxdiablo. Вы совершенно правы, сэр. Спасибо. – WhozCraig

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