如何使用fstream从第二行读取文本文件?

时间:2008-10-02 20:13:45

标签: c++ fstream

如何让我的std::fstream对象从第二行开始读取文本文件?

8 个答案:

答案 0 :(得分:27)

使用getline()读取第一行,然后开始读取流的其余部分。

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

(更改为std :: getline(感谢dalle.myopenid.com))

答案 1 :(得分:23)

您可以使用流的忽略功能:

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

答案 2 :(得分: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行时,使用getline需要大约一秒钟的22秒。

答案 3 :(得分:2)

调用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;
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

此代码可以从文件的指定行读取文件,但是您必须在文件资源管理器中创建文件,然后才能在下面给出我的文件名为“ temp”的代码

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

希望这会有所帮助

答案 6 :(得分:0)

您可以按以下方式使用忽略功能:

fstream dataFile("file.txt");
dataFile.ignore(1, '\n'); // ignore one line

答案 7 :(得分:-1)

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