Как читать текстовый файл со второй строки, используя fstream?

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Более эффективным способом является игнорирование строк с помощью 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.

Ответ 4

Вызвать 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;
}

Ответ 5

#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;
}

Ответ 6

этот код может считывать файл из указанной вами строки из файла, но вы должны создать файл в проводнике, прежде чем мне дадут имя файла "временный" код

https://i.stack.imgur.com/OTrsj.png

надеюсь, это поможет

Ответ 7

#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;
}