4

我需要在现有文件的第 45字节之前添加一个字符串。我尝试使用fseek如下所示。

int main()
{
    FILE *fp;
    char str[] = "test";     

    fp = fopen(FILEPATH,"a");
    fseek(fp,-45, SEEK_END);                
    fprintf(fp,"%s",str);
    fclose(fp);     
    return(0);
}

我希望这段代码会在 EOF 的第 45字符之前添加“test”,相反,它只是将“test”附加到 EOF。

请帮助我找到解决方案。

这是我之前的问题的延续
将项目附加到 c 中最后一行之前的文件

4

3 回答 3

11

使用模式 r+(如果它已经存在)或 a+(如果它不存在并且您想要创建它)打开它。由于您要在文件结尾之前寻找 45 个字节,我假设它已经存在。

fp = fopen(FILEPATH,"r+");

您的其余代码都很好。另请注意,这不会插入文本,但会覆盖文件中该位置当前的任何内容。

即,如果您的文件如下所示:

xxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxx

然后运行这段代码后,它会是这样的:

xxxxxxxtestxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxx

如果你真的想插入而不是覆盖,那么你需要将SEEK_END-45到EOF的所有文本读入内存,写测试然后写回文本

于 2010-07-16T11:54:26.657 回答
3

a如果您打算在任意位置写入,请不要将其作为 append ( ) 打开;它将强制所有写入到文件末尾。您可以使用r+在任何地方读取或写入。

于 2010-07-16T11:50:40.520 回答
0

为避免特定于平台的配置,请始终在 fopen() 调用中明确指出二进制或文本模式。

如果您有一天移植代码,这将为您节省数小时的绝望。

于 2010-07-16T12:12:29.580 回答