0

コードを見てみましょう:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>
#include <cstdlib>


using namespace std;


int main()
{
    string usrFileStr,
    fileStr = "airNames.txt",  // declaring string literal
    sLine;                        // declaring a string obj

    fstream inFile;                  // declaring a fstream obj
    char ch;

    cout << "Enter a file: ";
    cin >> usrFileStr;


    inFile.open( usrFileStr.c_str(), ios::in ); 
    // at this point the file is open and we may parse the contents of it


    while ( !inFile.eof() )
    {
          getline ( inFile, sLine ); // store contents of txt file into str Obj
          for ( int x = 0; x < sLine.length(); x++ )
          {         
              if ( sLine[ x ] == ',' )break; // when we hit a comma stop reading 
              //cout << sLine[ x ];
          }
          cout << endl;
    }      



        while ( !inFile.eof() )  //read the file again until we reach end of file
        {
                // we will always want to start at this current postion;
              inFile.seekp( 6L, ios::cur );

              getline( inFile, sLine ); // overwrite the contents of sLine
              for ( int y = 0; y < sLine.length(); y++ )
              {
                  if ( sLine[ y ] == ',' )break; // hit a comma then goto seekp until eof
                  cout << sLine[ y ];
              }
              cout << endl;
        }

    inFile.clear();
    inFile.close();



    fgetc( stdin );
    return 0;
}

私のテキストファイル形式はこれに似ています:

string, string andthenspace, numbers, morenumbers

ファイルを 2 回読み取ることができないようです。EOF毎回チェックして..

最初のwhile条件が機能し、必要なもの、コンマの前の最初のフィールド、およびコンマを含まないものを提供します。

だから私が2回目に考えたのは、2番目の各反復でそこから開始する関数だけでOK seekp(X, ios::cur)..

残念ながら、ファイルをもう一度読み取っていません..

4

3 に答える 3

3

まず、while ループで eof をテストしないでください。フラグは、ファイルの最後に到達すると trueなります。つまり、遅すぎます。テストは、読み取りの直後で、読み取りが期待されるものを使用する前に行う必要があります。->

while (std::getline(......))

次に、Jonathan Leffler が解決策を提供し、seekg を呼び出す前に状態ビットをクリアします。ただし、ジェイミーが指摘したように、あなたのアプローチはいくぶん複雑に思えます。

于 2009-01-20T09:56:50.037 に答える
3

最初に EOF を読み取った後、おそらくストリームのエラー ビットをクリアする必要があります。つまり、シーク操作を行うだけでなく。

于 2009-01-20T00:36:48.280 に答える
1

あなたはそれについて間違った方向に進んでいるようです:

FILE * file;
file = fopen ("file.txt","r");


if (file!=NULL){
        while (!feof(file)) {           
                fscanf(file,"%s ,%s ,%s ,%s",str1,str2,str3,str4);
        }
        fclose (file);
};

明らかに上記の例を拡張できますが、動作するかどうかを確認する時間がありませんでした。

于 2009-01-20T00:40:46.527 に答える