1

問題の説明

一連の行を含むファイルがあります。あ

ファイル 1:

"Hello How are you"

"The cat ate the mouse"

ユーザーが入力として指定した行の開始と終了に基づきます。ファイルの各行に移動して抽出したいと思います。

たとえば、ユーザーが117と入力した場合、サイズが17文字の1行目に移動する必要があります。彼は、ファイル内の任意の行番号を指定できます。

ファイル C++ の特定の場所から次の Answer Read を読みました。でもよくわからなかった。なぜ行は同じサイズでなければならないのですか? ファイル内のすべての行の開始と終了に関する情報がある場合。直接アクセスできないのはなぜですか?


ソースコード

Read Data From Specified Position in File Using Seekgに触発された次のコードを使用しようとしましたが、なぜ行を抽出できませんでしたか?

    #include <fstream>
    #include <iostream>

    using namespace std::

    void getline(int, int, const ifstream & );
    int main()
    {
      //open file1 containing the sentences
      ifstream file1("file1.txt");

      int beg = 1;
      int end = 17;
      getline(beg,end, file1);

      beg = 2;
      end = 20;
      getline(beg,end, file1);

      return 0;
    }

void getline(int beg, int end, const ifstream & file)
{
   file.seekg(beg, ios::beg); 
   int length = end;

   char * buffer = new char [length];

   file.read (buffer,length);

   buffer [length - 1] = '\0'; 

   cout.write (buffer,length);
   delete[] buffer;
}
4

1 に答える 1

4

このコードは、行番号をバイト オフセットとして使用しているようです。オフセット "1" を求める場合、ファイルは 1 行ではなく 1 バイト先にシークします。オフセット 2 をシークする場合、ファイルは 2 行ではなく 2 バイト前方にシークします。

特定の行をシークするには、ファイルを読み取り、目的の行に到達するまで改行の数をカウントする必要があります。たとえば、すでにこれを行っているコードがありますstd::getline()必要な行の正確なバイトオフセットがわからない場合は、必要なstd::getline()行番号と同じ回数を呼び出すことができます。

また、ファイルの最初のバイトはオフセット 1 ではなくオフセット 0 にあり、プラットフォームが異なれば、行の終わりを示すために異なるバイトが使用されることも覚えておいてください (たとえば、Windows では"\r\n"、Unix では"\n"です)。ライブラリ関数を使用して行を読み取る場合は、行末を処理する必要があります。

于 2015-09-24T17:03:20.177 に答える