连续的fwrites操作是什么意思?

3

我已经以写模式打开了一个文件,如下所示:

int a = 10;
char b = 'm';
int y = 0;
char z;

FILE *fp = NULL;
fp = fopen("/config/gps_backup.dat","w");

我正在将两个变量写入文件中(第一个是整数,第二个是字符),如下所示:

fwrite(&a,1,sizeof(int),fp);
fwrite(&b,1,sizeof(char),fp);
  1. 两次连续的fwrite操作会相互覆盖吗?
  2. 如果不会,那么两个连续的fread操作能否正确地填充到我的变量中?

例如:

fread(&y,1,sizeof(int),fp);
fread(&z,1,sizeof(char),fp);

如果进行连续的fread操作,y和z变量是否可以持有值为10和'm'。

那么


你的完整代码是什么?你的读取操作是在写入操作之后立即执行还是什么时候执行? - Agnius Vasiliauskas
2个回答

5

只要不并行执行,连续的fread或fwrite不应该有任何问题。

系统将在FILE *中维护寻址指针,并确保您在连续的fwrites和freads期间获得正确的数据读取和写入。

您可以参考man page获取更多详细信息。

在RETURN VALUES部分,它明确说明如下:

 The functions fread() and fwrite() advance the file position indicator
 for the stream by the number of bytes read or written.  They return the
 number of objects read or written.  If an error occurs, or the end-of-
 file is reached, the return value is a short object count (or zero).

1
不会,连续的写操作不会相互覆盖。它们是在同一个文件描述符上执行的,操作系统会进行跟踪并且不会覆盖。至于读取操作,只要在读取之间不关闭文件描述符,两次读取将正确地填充您的变量,前提是您正确解析了大小。

@Cytinus..所以,如果我使用两个fwrite操作,其中第一个变量写为整数,第二个变量写为字符。第一个fread操作将给我整数,而第二个fread操作将给我字符,对吗? - Maddy
不,fread会将其传递的任何内容视为字符缓冲区。您可能需要执行类似以下的操作:yint = atoi(y); 以获取整数值。 - cytinus
@cytinus,使用atoi绝对没有用处,因为fwritefread是二进制工作的。 - Christian Rau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接