首先,我想在文本文件中插入字符。我想将字符(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,但是我不知道它是如何工作的。或有另一种方法?
答案 0 :(得分:1)
您不能在现有文件的开头或中间插入/删除数据,只能在结尾/插入数据。
如果原始文件足够小,可以完全容纳在内存中,则可以将整个文件读入内存,根据需要进行操作,然后将其写回到新文件中,从而覆盖原始文件。
否则,您将需要从原始文件读取并将其数据写入辅助文件,直到到达要插入/删除数据的位置,然后按照以下步骤向/从新文件写入/省略所需的数据:需要,然后完成读取原始文件并将其写入新文件的操作。然后用新文件替换原始文件。
答案 1 :(得分:0)
除非您正在处理大于RAM的1/2的文件,否则需要将文本文件加载到RAM中,在其中检测其长度,进行修改,然后将其写回到磁盘。如果文件很大,则需要制作一个文件流驱动程序,但是除非您试图防止SSD垃圾,否则最好的选择是Read-Modify-Write方法。
答案 2 :(得分:0)
其他答案建议将整个文件加载到内存中,所以我想发表评论:
如果存在内存问题,请尝试以下操作:
优点:可以处理两倍于内存的文件,减少了复制。
缺点:更多迭代