【问题标题】:How to insert char in middle of text file?如何在文本文件中间插入字符?
【发布时间】:2018-08-03 00:54:48
【问题描述】:

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

@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,但我不明白它是如何工作的。还是有别的办法???

【问题讨论】:

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


    【解决方案1】:

    您不能在现有文件的前面或中间插入/删除数据,只能从末尾插入/删除。

    如果您的原始文件小到可以完全放入内存,您可以将整个文件读入内存,根据需要对其进行操作,然后将其写回新文件,覆盖原始文件。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        如果内存有问题,请尝试以下方法:

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

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

        缺点:更多迭代

        【讨论】:

        • 我认为问题使用“中间”的意思是“在开始和结束之间”,不一定是文件的精确中点。您可能需要调整答案以涉及扫描文件以查找插入点,而不是假设 size/2。
        猜你喜欢
        • 2020-05-20
        • 1970-01-01
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-30
        • 1970-01-01
        相关资源
        最近更新 更多