如何在 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)";
我该怎么做呢?
如何在 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)";
我该怎么做呢?
fseek
不是在寻找计数行,而是在寻找字节。您指示程序不是将指针定位在第 17 行的第 20 列,而是定位在文件的第 17 + 20 = 37 字节。
该函数的第一个参数是原点,即从原点开始计算的字节数,第二个参数是偏移量。
请参阅的参考资料。fseek
我不知道有任何库可以针对 C++ 中的行和列进行字节定位。您可能需要使用更高级别的函数并逐行解析(例如,getline
如果您使用 C++ 解决方案,则使用)。
使用 fputs,就像在这里做的一样。为了识别换行符,您必须遍历内容并计算换行符(即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 写入想要的内容,像这样:
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
.