从键盘获取输入并插入二进制文件

时间:2014-05-03 15:45:14

标签: c file-io

我正在尝试编写一个函数,以struct的形式从用户那里获取输入,并将其插入到二进制文件中。 (足球结果)用户输入teamAteamBgoalsAgoalsB当我尝试显示我输入的内容时,我无法获得正确的结果。我究竟做错了什么? 代码:

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);
}

2 个答案:

答案 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);
   }