web-dev-qa-db-ja.com

fstreamを使用して2行目からテキストファイルを読み取るにはどうすればよいですか?

std::fstreamオブジェクトは2行目からテキストファイルの読み取りを開始しますか?

17
Tal

Getline()を使用して最初の行を読み取り、次に残りのストリームの読み取りを開始します。

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

(std :: getlineに変更(感謝dalle.myopenid.com))

28
Doug T.

ストリームの無視機能を使用できます:

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;
}
23
Martin York

より効率的な方法は、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は標準ではありませんが、もちろんhand-madeです。最初のパラメーターは、抽出する最大文字数です。これがnumeric_limits :: max()である場合、制限はありません:cplusplus.comのリンク: std :: istream :: ignore

多くの行をスキップする場合は、必ずgetlineの代わりにそれを使用する必要があります。ファイルで100000行をスキップする必要がある場合、getlineの場合は22秒ではなく、約1秒かかりました。

3

Getline()を1回呼び出して、最初の行を破棄します

他の方法がありますが、問題はこれです、あなたは最初の行がどれくらいの時間になるかわかりませんか?したがって、最初の「\ 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;
}
2
Adam

このコードは、ファイルから指定された行からファイルを読み取ることができますが、ファイル名を「temp」にする前に、ファイルエクスプローラーでファイルを作成する必要があります

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

これが役に立てば幸い

0
Chabs
#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
Aaron Sterling