【问题标题】:How to edit a text file with C++如何使用 C++ 编辑文本文件
【发布时间】:2012-11-04 13:38:23
【问题描述】:

如何在 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++ text-files fstream


    【解决方案1】:

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

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

    查看fseekreference

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

    【讨论】:

    • 确实如此。在您的示例中,First 从字节 0 开始,Line 从字节 6 开始,blah 在字节 11 等。您会看到:fseek 命令不理解任何行、句子和单词。
    • 那么字节数会受到它之前的字符数的影响吗?如果第 16 行有 6000 个字符,它会改变第 17 行第 20 列的字节数吗?
    • @JoshI:会的。有 6000。请参阅我的其他评论
    • 好吧,这让我的计划出现了问题……哈。感谢您的澄清。
    • 这个问题有一个简单的解决方案——实现下面的例子。
    【解决方案2】:

    使用 fput,就像 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写入所需的内容,如下所示:

     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 所要求的。
    • 我添加了有关计算换行符的信息。它应该可以工作 - 在你有固定宽度线的情况下,它会比你建议的阅读整行更好。
    • 我很高兴删除反对票。我真的很讨厌放置它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多