【发布时间】:2021-05-06 17:03:21
【问题描述】:
我正在尝试打开一个二进制文件,从中读取一部分然后对其进行修改,但这最终会陷入无限循环。
在编写程序之前我的想法:
- EOF 是一个函数返回的值,当找到文件结尾或发生错误时,该函数从流中读取/写入流。
- 文件指示器将随着每次成功的读/写而向右移动它读取的字节大小。 (即如果位置指示器在 0 位置,如果在成功读/写后读/写 44 个字节,它将转到位置 44。)
下面的代码是我的许多方法之一,但没有成功:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stoixeia
{
char e[30];
char t[5];
float mo;
int ilikia;
};
int main(void)
{
FILE *fptr;
struct stoixeia st;
int c;
if((fptr = fopen("sxoleio","rb+")) == NULL)
exit(1);
while((c = fread(&st,sizeof(struct stoixeia),1,fptr)) != EOF)
{
fseek(fptr,-44,SEEK_CUR);
for(int i = 0; i < strlen(st.e); i++)
st.e[i] += 1;
fwrite(&st,sizeof(struct stoixeia),1,fptr);
}
fclose(fptr);
return 0;
其他不成功的方法:(feof,检查循环内的eof等)
到目前为止,我唯一的成功是使用以下代码:
while((c = fgetc(fptr)) != EOF)
{
fseek(fptr,-1,SEEK_CUR);
fread(&st,sizeof(struct stoixeia),1,fptr);
fseek(fptr,-44,SEEK_CUR);
for(int i = 0; i < strlen(st.e); i++)
st.e[i] += 1;
fwrite(&st,sizeof(struct stoixeia),1,fptr);
fseek(fptr,1,SEEK_CUR);
fseek(fptr,-1,SEEK_CUR);
}
fclose(fptr);
使用fgetc()作为while条件并在操作后将指示符向右移动一个字节然后将其向后移动一个字节似乎触发EOF并且程序以成功结束。
这种行为的原因是什么?
我真的很想了解这个行为,所以任何事情都会非常感激。
提前致谢。
【问题讨论】:
-
成功时,
fread()和fwrite()返回读取或写入的项目数。此数字等于仅当 size 为 1 时传输的字节数。如果发生错误或到达文件末尾,返回值是一个短项计数(或零)。跨度> -
使用
-sizeof st代替-44(也代替sizeof(struct stoixeia)) 不要使用strlen(读取可能没有正确地以null 终止字符串,而是使用for( size_t i = 0; st.e[i] && i < sizeof st.e; i++ ){。将fread的结果与 1 而不是 EOF 进行比较
标签: c file binaryfiles