我正在尝试编写一个函数,以struct
的形式从用户那里获取输入,并将其插入到二进制文件中。 (足球结果)用户输入teamA
,teamB
,goalsA
和goalsB
当我尝试显示我输入的内容时,我无法获得正确的结果。我究竟做错了什么?
代码:
void addResult()
{
struct matches match;
char input[100];
FILE * file1;
file1 = fopen("matches.bin","rw+b");
printf("Enter the resulst you want to add to the file\n");
scanf("%s",input);
while(!feof(file1))
fread(&match,sizeof(match),1,file1);
fseek(file1,sizeof(match),SEEK_END);
fwrite(&input,sizeof(match),1,file1);
fflush(file1);
fclose(file1);
file1 = fopen("matches.bin","r");
while(!feof(file1)) {
fread(&match,sizeof(match),1,file1);
printf("%s %s %i %i\n",match.teamA,match.teamB,match.goalsA,match.goalsB);
}
fclose(file1);
}
答案 0 :(得分:1)
您的方法的主要问题是,用户输入的字符串必须在某个时刻转换为struct matches
。这样做在C中是一个令人讨厌的尴尬任务:您需要先将用户输入拆分为以空格分隔的单词或类似内容,以获取.teamA
,.teamB
,.goalsA
的字符串表示形式.goalsB
(例如使用index
中的函数<strings.h>
),然后您需要使用{{将目标数字的字符串表示形式转换为整数值1}}来自atoi
的函数。
将新数据作为<stdlib.h>
后,您可以使用以下命令将新结构附加到文件中:
struct matches
文件模式file1 = fopen("matches.bin", "a+b");
fwrite(&inputAsStruct, sizeof(match), 1, file1);
打开文件进行读写,根据需要创建新文件,并确保最后附加写入。
要输出您不需要关闭并重新打开文件的记录。您可以使用a+
将文件位置移回文件的开头:
fseek
最后,正如其他人所指出的那样,fseek(file1, 0, SEEK_SET);
可能无法可靠地检测到文件的结尾。我相信它只能保证在feof
失败一次后工作,因为它到达文件末尾,所以你应该检查fread
的返回值。
答案 1 :(得分:0)
这是一种类似的方法......
void addResult()
{
struct matches match; /* Structure to write & read */
char input[100]; /* User input buffer. */
FILE *file1=NULL; /* file handle. */
/* Initialize 'match' from user input. */
printf("Enter team A name:\n");
fgets(match.teamA, sizeof(match.teamA), stdin);
printf("Enter team A goals: \n");
fgets(input, sizeof(input), stdin);
match.goalsA = atoi(input);
printf("Enter team B name:\n");
fgets(match.teamB, sizeof(match.teamB), stdin);
printf("Enter team B goals: \n");
fgets(input, sizeof(input), stdin);
match.goalsB = atoi(input);
/* Open the file in 'append/read/binary' mode */
file1 = fopen("matches.bin","a+b");
if(NULL == file1)
{
fprintf(stderr, "fopen() failed. errno[%d]\n", errno);
goto CLEANUP;
}
/* write the new match record at the end of the file. */
fwrite(&match, sizeof(match), 1 ,file1);
/* Rewind the file handle to the beginning of the file. */
fseek(file1, 0L, SEEK_CUR);
/* List all file records. */
while(!feof(file1))
{
fread(&match,sizeof(match),1,file1);
printf("%s %s %i %i\n",
match.teamA,
match.teamB,
match.goalsA,
match.goalsB
);
}
/* Clean-up allocated resources & return. */
CLEANUP:
if(file11)
fclose(file1);
}