如何在文本文件中间插入char?

时间:2018-08-03 00:54:48

标签: c++ printf visual-studio-express seek

首先,我想在文本文件中插入字符。我想将字符(DAD1)打印到文本文件的中间(带有DA D1的 HERE ),文本文件看起来像这样=>

@2100
AB CD EF 12 43 56
A3 B2 34 56 .....
...............78
@ffb4
FF FF FF FF(***HERE***)
@ffc0
FA 21 FA 21 ....

我尝试使用fprintf,但它会在文件末尾打印。这是我的编码部分=>

fp = fopen("testing.txt", "r+");

if (fp)
{
    while (c != EOF)
    {
        c = getc(fp);
        if (c == '@')
        {
            cout << c ;
            while (c != '\n')
            {

                c = getc(fp);
                cout << c ;

            }
            addr ++ ;
        }
        else
        {
            if (addr == 1)
              { ***DO SOMETHING***}

            else if (addr == 2)
             {
              char higha = hia.to_ullong() + ((hia.to_ullong() >= 10) ? 55 : 48);
              char highb = hib.to_ullong() + ((hia.to_ullong() >= 10) ? 55 : 48);
              char lowa  = loa.to_ullong() + ((loa.to_ullong() >= 10) ? 55 : 48);
             char lowb  = lob.to_ullong() + ((lob.to_ullong() >= 10) ? 55 : 48);
             fprintf(fp, "%c", higha);
             fprintf(fp, "%c", highb);
             fprintf(fp, " ");
             fprintf(fp, "%c", lowa);      
             fprintf(fp, "%c", lowb);
             }
         }
    }
}

我尝试使用SEEK_CUR,但是我不知道它是如何工作的。或有另一种方法?

3 个答案:

答案 0 :(得分:1)

您不能在现有文件的开头或中间插入/删除数据,只能在结尾/插入数据。

如果原始文件足够小,可以完全容纳在内存中,则可以将整个文件读入内存,根据需要进行操作,然后将其写回到新文件中,从而覆盖原始文件。

否则,您将需要从原始文件读取并将其数据写入辅助文件,直到到达要插入/删除数据的位置,然后按照以下步骤向/从新文件写入/省略所需的数据:需要,然后完成读取原始文件并将其写入新文件的操作。然后用新文件替换原始文件。

答案 1 :(得分:0)

除非您正在处理大于RAM的1/2的文件,否则需要将文本文件加载到RAM中,在其中检测其长度,进行修改,然后将其写回到磁盘。如果文件很大,则需要制作一个文件流驱动程序,但是除非您试图防止SSD垃圾,否则最好的选择是Read-Modify-Write方法。

答案 2 :(得分:0)

其他答案建议将整个文件加载到内存中,所以我想发表评论:

如果存在内存问题,请尝试以下操作:

  1. 遍历文件以确定其大小(不加载到内存中)。
  2. 将文件指针设置为size / 2,然后将文件的后半部分读取到内存中。
  3. 在大小为2的索引处插入字节。
  4. 在插入字节后追加内存的后半部分。

优点:可以处理两倍于内存的文件,减少了复制。

缺点:更多迭代