用ANSI C中的fread读取整数

时间:2013-04-17 16:41:17

标签: c file-io fread

我正在用C编写一个程序,我正在使用fread读取文本文件,我无法正确读取整数。

文本文件中a的值为16,我得到的输出是:

 a= 538976288

我使用了一个类似的代码来读取成功的二进制文件。我想了解在c中读取ASCII表的最佳方法是什么。

表大小由文件顶部的整数给出。数据用空格分隔。

这是我写的简单代码:

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

int main(int argc, char *argv[])
{
  int a, flag_fread;
  FILE * p_finput = NULL;
  char * filename = NULL;

  filename = malloc(sizeof(char) * (strlen(argv[1]) + 1));
  strncpy(filename, argv[1],strlen(argv[1]));
  filename[strlen(argv[1])] = '\0';

  p_finput = fopen(filename, "r");
  if (p_finput == NULL)
    {
      printf("couldn't open %s \n", filename);
      abort();
    }


  flag_fread = fread(&(a), sizeof(int), 1, p_finput);

  printf("a= %d \n", a);  

  fclose(p_finput);
  free(filename);
  return 0;
}

2 个答案:

答案 0 :(得分:3)

要阅读以文字书写的值,您应该使用fscanf,如下所示:

fscanf(p_finput, "%d", &a);

答案 1 :(得分:2)

fread以原始的二进制形式读取文件中的数据。以这种方式存储数据时可行,例如fwrite。在处理文本时,您可以使用fscanf但是建议使用它,因为它不会进行任何边界检查,这可能会导致缓冲区溢出。

更好的做法是使用fgets读取文件,然后使用sscanf获取所需的值。例如:

char buffer[100];
int itemsScanned = 0;
if(fgets(buffer, 100, p_finput) != NULL){
    itemsScanned = sscanf(buffer, "%d", &a);
}
/* check itemsScanned & continue */