0

C++ でテキスト ファイルの特定の行を編集するにはどうすればよいですか? ファイルを開いて、フォーカスやポインターなどを 17 行目の 20 列目に変更したいとします。これにより、17 行目の 20 列目以降のテキストを編集できます。

これを試しましたが、うまくいきませんでした。

ofstream txtFile("textFile.txt");
fseek(txtFile, 17, 20);
txtFile << "New stuff to enter at this point (overwrites old not insert)";

どうすればいいですか?

4

2 に答える 2

1

fseek行を数えるのではなく、バイト数を求めています。プログラムに指示するのは、ポインターを 17 行目の 20 列目ではなく、ファイルの 17 + 20 = 37 バイト目に配置することです。

関数の最初のパラメータは起点、つまり起点からカウントするバイト数であり、2 番目のパラメータはさらに何バイトオフセットするかです。

のリファレンスを参照してくださいfseek

C++ の行と列に関してバイト配置を行うことができるライブラリを認識していません。おそらく、より高いレベルの関数を使用して、行を 1 つずつ解析する必要があります (たとえばgetline、C++ ソリューションを使用している場合は使用します)。

于 2012-11-04T13:41:21.243 に答える
0

ここで行われているように、fputs を使用します。改行を認識するためには、コンテンツをループして改行文字 (Linux では「\n」) をカウントする必要があります。getcで現在指されている文字を取得できます。

これを実装する 1 つの方法は、次のように、指定された行の開始位置のバイト位置を返す関数を作成することです。

#include <stdio.h>

int getRowPos(int row,FILE* fp){
  int pos=1,lines=1,currChr;
  do{
    currChr=getc(fp);
    if(currChr=='\n')
      lines++;
  }while(lines<row && currChr!=EOF && ++pos);
  return pos;
}

これを使用すると、列番号 (行のバイト番号) を加えfseekた位置に移動し、次のように fputs を使用して目的のコンテンツを書き込むことができます。getRowPos

 int row=wanted row
 int col=wanted column

 FILE * pFile;
 //Open file for read and write                                                                        
 pFile = fopen ( "myfile.txt" , "rb+" );
 int rowPos=getRowPos(row,pFile);
 fseek ( pFile , rowPos+colPos , SEEK_SET );
 fputs ( "my new content" , pFile );
 fclose ( pFile );

行の幅がわかっている場合、たとえば n 幅の場合、lseekへの呼び出しの前にスキップ n バイトを追加できますgetc

于 2012-11-04T13:43:20.327 に答える