Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C++; 如何编辑C++中的文本文件的特定行?假设我想打开一个文件,并将焦点或指针或其调用的任何内容更改为第17行第20列。这样我就可以编辑第17行第20列之后的文本_C++_Text Files_Fstream - Fatal编程技术网

如何使用C++; 如何编辑C++中的文本文件的特定行?假设我想打开一个文件,并将焦点或指针或其调用的任何内容更改为第17行第20列。这样我就可以编辑第17行第20列之后的文本

如何使用C++; 如何编辑C++中的文本文件的特定行?假设我想打开一个文件,并将焦点或指针或其调用的任何内容更改为第17行第20列。这样我就可以编辑第17行第20列之后的文本,c++,text-files,fstream,C++,Text Files,Fstream,我试过这个,但没用 ofstream txtFile("textFile.txt"); fseek(txtFile, 17, 20); txtFile << "New stuff to enter at this point (overwrites old not insert)"; 流txtFile(“textFile.txt”)的; fseek(txtFile,17,20); txtFilefseek不是在寻找计数行,而是在寻找字节。您指示程序的不是将指针定位在第17行的第20

我试过这个,但没用

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

txtFile
fseek
不是在寻找计数行,而是在寻找字节。您指示程序的不是将指针定位在第17行的第20列,而是定位在文件的第17+20=37字节

函数的第一个参数是原点,即从原点开始计算的字节数,第二个参数是偏移量

请参阅
fseek的

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

使用FPATS,就像它完成了一样。为了识别新行,您必须循环内容并计算新行字符(即linux上的“\n”)。您可以使用获取当前指向的角色

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

#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;
}
 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个字节。这并不能满足OP的要求,正如我的回答所指出的。我添加了有关计算换行符的信息。它应该是有效的——而且在你有固定宽度的线条的情况下,它会比你建议的阅读整条线条要好。我很高兴删除反对票。我真的很讨厌把它们放在那里,真的。在您的示例中,首先从字节0开始,行在字节6,blah在字节11等等。您可以看到:
fseek
命令不理解任何行、句子和单词。那么字节计数是否受前面字符数的影响?如果第16行有6000个字符,它会改变第17行第20列的字节数吗?@JoshI:会的。有6000人。看看我的另一篇评论,它给我的计划带来了麻烦。。。哈感谢您的澄清。这个问题有一个简单的解决方案-在下面的示例中实现。