Как мне прочитать текстовый файл из второй строки, используя fstream? - PullRequest
17 голосов
/ 03 октября 2008

Как я могу заставить мой std::fstream объект начать читать текстовый файл из второй строки?

Ответы [ 6 ]

27 голосов
/ 03 октября 2008

Используйте getline (), чтобы прочитать первую строку, затем начните читать остальную часть потока.

ifstream stream("filename.txt");
string dummyLine;
getline(stream, dummyLine);
// Begin reading your stream here
while (stream)
   ...

(изменено на std :: getline (спасибо dalle.myopenid.com))

23 голосов
/ 03 октября 2008

Вы можете использовать функцию игнорирования потока:

ifstream stream("filename.txt");

// Get and drop a line
stream.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );

// Get and store a line for processing.
// std::getline() has a third parameter the defaults to '\n' as the line
// delimiter.
std::string line;
std::getline(stream,line);

std::string word;
stream >> word; // Reads one space separated word from the stream.

Распространенная ошибка при чтении файла:

while( someStream.good() )  // !someStream.eof()
{
    getline( someStream, line );
    cout << line << endl;
}

Это невозможно, потому что: при чтении последней строки он не читает маркер EOF. Таким образом, поток все еще хорош, но в потоке больше нет данных для чтения. Таким образом, цикл повторяется. Затем std :: getline () пытается прочитать другую строку из someStream и завершается неудачно, но все равно записывает строку в std :: cout.

Простое решение:
while( someStream ) // Same as someStream.good()
{
    getline( someStream, line );
    if (someStream) // streams when used in a boolean context are converted to a type that is usable in that context. If the stream is in a good state the object returned can be used as true
    {
        // Only write to cout if the getline did not fail.
        cout << line << endl;
    }
}
Правильное решение:
while(getline( someStream, line ))
{
    // Loop only entered if reading a line from somestream is OK.
    // Note: getline() returns a stream reference. This is automatically cast
    // to boolean for the test. streams have a cast to bool operator that checks
    // good()
    cout << line << endl;
}
3 голосов
/ 29 июля 2014

Более эффективный способ - игнорировать строки с помощью std :: istream :: ignore

for (int currLineNumber = 0; currLineNumber < startLineNumber; ++currLineNumber){
    if (addressesFile.ignore(numeric_limits<streamsize>::max(), addressesFile.widen('\n'))){ 
        //just skipping the line
    } else 
        return HandleReadingLineError(addressesFile, currLineNumber);
}

HandleReadingLineError не стандартная, а ручной , конечно. Первый параметр - это максимальное количество символов для извлечения. Если это точно numeric_limits :: max (), ограничений нет: Ссылка на cplusplus.com: std :: istream :: ignore

Если вы собираетесь пропустить много строк, вам определенно следует использовать его вместо getline: когда мне нужно было пропустить 100000 строк в моем файле, это заняло около секунды вместо 22 секунд с getline.

2 голосов
/ 03 октября 2008

Вызовите getline () один раз, чтобы выбросить первую строку

Существуют и другие методы, но проблема в том, что вы не знаете, как долго продлится первая строка? Так что вы не можете пропустить это, пока не узнаете, где находится этот первый '\ n'. Однако, если бы вы знали, какой длины будет первая строка, вы можете просто пройти мимо нее и начать читать, это будет быстрее.

Таким образом, первый способ будет выглядеть примерно так:

#include <fstream>
#include <iostream>
using namespace std;

int main () 
{
    // Open your file
    ifstream someStream( "textFile.txt" );

    // Set up a place to store our data read from the file
    string line;

    // Read and throw away the first line simply by doing
    // nothing with it and reading again
    getline( someStream, line );

    // Now begin your useful code
    while( !someStream.eof() ) {
        // This will just over write the first line read
        getline( someStream, line );
        cout << line << endl;
    }

    return 0;
}
0 голосов
/ 18 мая 2013
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
string textString;
string anotherString;
ifstream textFile;
textFile.open("TextFile.txt");
if (textFile.is_open()) {
    while (getline(textFile, textString)){
        anotherString = anotherString + textString;
    }
}

std::cout << anotherString;

textFile.close();
return 0;
}
0 голосов
/ 03 октября 2008
#include <fstream>
#include <iostream>
using namespace std;

int main () 
{
  char buffer[256];
  ifstream myfile ("test.txt");

  // first line
  myfile.getline (buffer,100);

  // the rest
  while (! myfile.eof() )
  {
    myfile.getline (buffer,100);
    cout << buffer << endl;
  }
  return 0;
}
...