2017-02-13 36 views
0

У меня есть ситуация, когда я прохожу через первые 64 строки файла и сохраняю каждую строку в строке. Остальная часть файла неизвестна. Это может быть одна строка или много. Я знаю, что в начале файла будет 64 строки, но я не знаю их размера.Сохранение данных файла из текущей позиции в конец файла с помощью fstream

Как сохранить всю остальную часть файла в строке?

Это то, что я в настоящее время:

std::ifstream signatureFile(fileName); 

for (int i = 0; i < 64; ++i) { 
    std::string tempString; 
    //read the line 
    signatureFile >> tempString; 
    //do other processing of string 
} 
std::string restOfFile; 
//save the rest of the file into restOfFile 

Благодаря ответам это, как я получил это работает:

std::ifstream signatureFile(fileName); 

for (int i = 0; i < 64; ++i) { 
    std::string tempString; 
    //read the line 
    //using getline prevents extra line break when reading the rest of file 
    std::getline(signatureFile, tempString); 
    //do other processing of string 
} 

//save the rest of the file into restOfFile 
std::string restOfFile{ std::istreambuf_iterator<char>{signatureFile}, 
     std::istreambuf_iterator<char>{} }; 
signatureFile.close(); 
+1

Остальная часть файла может быть больше, чем размер ОЗУ, даже одна строка может превышать этот размер. Таким образом, чтобы прочитать неизвестное количество данных, используйте read + gcount – user5821508

+3

. Вы на самом деле не читаете * строки *, вы читаете * слова *. Взгляните на ['std :: getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline). –

+0

Спасибо! Это только спасло меня. Я получал дополнительную строку, когда использовал метод Сэма. Использование getline устраняет проблему. – Tommizzy

ответ

4

Один из конструкторов std::string «s шаблон, который принимает два итератора как параметры, итератор начала и окончания, и строит строку из последовательности, определенной итераторами.

Просто так получилось, что std::istreambuf_iterator обеспечивает соответствующий входной итератор для перебора содержимого входного потока:

std::string restOfFile{std::istreambuf_iterator<char>{signatureFile}, 
     std::istreambuf_iterator<char>{}}; 
+0

Я немного смущен, как работают istreambuf_iterators. Как получить текущую позицию после цикла for и установить ее на итератор? – Tommizzy

+0

У вас нет. Итератор делает это за вас. Вы просто передаете объект потока потока в конструктор итератора, и он будет итерации, начиная с текущей позиции. Как и в примере, который я показал в своем ответе. –

+0

Интересно, я сделаю это. Итак, второй аргумент означает, что он будет продолжать писать строку до тех пор, пока не ударит конец файла? – Tommizzy

0

Вы можете использовать буфер строки.

#include <sstream> 

// ... 

stringbuf buf; 
signatureFile.get(buf); 
string restOfFile = buf.str();