2016-08-31 4 views
0

Попытка вставить строку в середине файла, начиная с его конца.Может вставляться в fstream, но не в iostream

Следующий код работает с fstream, но не с iostream (в данном случае выходная строка равна входной):

// File contents: "abcdefghijklmnopqrstxyz"; "uvw" missing 

    // 1 - OK 
    //fstream iofs(fPath, ios_base::in | ios_base::out); 

    // 2 - Same output 
    filebuf fileBuffer; 
    iostream iofs(&fileBuffer); // generic output stream 
    fileBuffer.open(fPath.c_str(), ios_base::in | ios_base::out | ofstream::app); 
    iofs.rdbuf(&fileBuffer); 

    iofs.seekg(0, ios_base::end); 
    iofs.seekp(0, ios_base::end); 

    for(int i = 1; i < 20; ++i) 
    { 
     iofs.seekg(-i, std::ios_base::end); 

     char c = char(iofs.peek()); 

     if(c == 't') { 
      iofs.seekp(-i + 1, std::ios_base::end); 
      iofs << "uvw";  // add missing token 
      iofs << "xyz";  // append pre-existing token 
      break; 
     } 
    } 

Выход:
Случай 1: Begin = abcdefghijklmnopqrstxyz; Результат = abcdefghijklmnopqrstuvwxyz
Случай 2: Begin = abcdefghijklmnopqrstxyz; Результат = abcdefghijklmnopqrstxyz

Я делаю что-то неправильно или просто не могу сделать вставку в iostream?

+0

Вы проверяете содержимое потока в конце или в файле? Просто угадать здесь, но, возможно, fstream делает неявный флеш при уничтожении или некоторая синхронизация файлов, а iostream - нет. Вы можете попробовать флеш в конце. – Hayt

ответ

3

Общий iostream не доступен для поиска - подумайте о клавиатуре или принтере.

Вы не проверяете результат операции seekp. Вероятно, он терпит неудачу и устанавливает поток в состояние ошибки. Дальнейшие попытки вывода ничего не сделают.

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