gpt4 book ai didi

c - fgets 似乎会导致写入文件

转载 作者:行者123 更新时间:2023-11-30 18:12:59 24 4
gpt4 key购买 nike

在尝试帮助某人编写一段 Python 代码后,我运行了以下测试;我知道测试很简单,但我不明白为什么会发生这种情况。

基本思想是这样的:我有以下 C 代码:

#include <stdlib.h>
#include <stdio.h>

int main() {
FILE *pf = fopen("test.txt", "r+");
char buf[100];
fgets(buf, 100, pf);
fseek(pf, -7, SEEK_CUR);
fwrite("0", 1, 1, pf);
//NEXT LINE PROBLEMATIC
fgets(buf, 100, pf);
fclose(pf);
return 0;
}

以及包含一行的输入文件:abcdefghijklmnopqrstuvwxyz

我希望输出在字符串中包含零;然而,这种情况发生了:abcdefghijklmnopqrs0bcdefghijklmnopqrstuvwxyz

(文本后有多个空格字符)。如果我注释掉有问题的行(第二次调用 fgets),输出将按预期工作。

有人知道为什么会发生这种情况吗?

对我来说,这似乎是缓冲区溢出,因为行尾后面有空格字符;使用 cl.exe 而不是 gcc 进行复制我得到:abcdefghijklmnopqrs0bcdefghijklmnopqrstuvwxyzt e s t e\p y _ w e i r d\t e s t 。 t x t c l e ;i À ] h&^ u a

因此,这肯定是由于对 fgets 的调用与对 fseek/fwrite 的调用交织在一起而导致的溢出。

最佳答案

如果有人找到这个,n.m.的建议是正确的,我不知道为什么我第一次搜索时找不到它。请参阅此处的答案:why fseek or fflush is always required between reading and writing in the read/write "+" modes

有更多声誉的人,请标记为重复并关闭:)

关于c - fgets 似乎会导致写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28352280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com