如何使用C ++编辑文本文件

时间:2012-11-04 13:38:23

标签: c++ text-files fstream

如何在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)";

我该怎么做?

2 个答案:

答案 0 :(得分:1)

fseek不是寻求计数行,而是字节。你指示程序的目的不是将指针放在第17行的第20列,而是放在文件的17 + 20 = 37字节处。

该函数的第一个参数是原点,即来自您计算的原点的字节数,第二个参数 - 您偏移了多少。

请参阅fseek的{​​{3}}。

我不知道任何可以在C ++中对行和列进行字节定位的库。您可能需要使用更高级别的函数并逐个解析行(例如,如果您使用的是C ++解决方案,则使用getline。)

答案 1 :(得分:0)

使用fputs,就像它完成here一样。为了识别新行,你必须遍历内容并计算换行符(即linux上的'\ n')。您可以使用getc获取当前指向的字符。

实现此目的的一种方法是编写一个返回给定行开始位置的字节位置的函数,如下所示:

#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可以转到getRowPos返回的位置加上列号(即行上的字节数),然后使用fputs写出所需的内容,如下所示:< / p>

 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之前添加getc次跳过n个字节。