使用fread将数据存储到char缓冲区中

使用fread将数据存储到char缓冲区中,c,file-io,binaryfiles,C,File Io,Binaryfiles,我正在做一个项目,需要从二进制文件中读取数据。我试图将数据存储到一个字符缓冲区中。假设二进制文件由一个字符、一个int和一个double组成,字符缓冲区需要多大?我如何转换回int和double 我正在将数据读入一个字符缓冲区,因为这样可以提高程序的速度 谢谢 您可以使用fscanf函数将文件中的数据直接读取到急切等待的变量中: char c; int i; double d; FILE *fp = fopen("C:\\example.txt", "rb"); if (fp) { fs

我正在做一个项目,需要从二进制文件中读取数据。我试图将数据存储到一个字符缓冲区中。假设二进制文件由一个字符、一个int和一个double组成,字符缓冲区需要多大?我如何转换回int和double

我正在将数据读入一个字符缓冲区,因为这样可以提高程序的速度


谢谢

您可以使用fscanf函数将文件中的数据直接读取到急切等待的变量中:

char c;
int i;
double d;
FILE *fp = fopen("C:\\example.txt", "rb");
if (fp)
{
    fscanf(fp, "%c%d%lf", &c, &i, &d);
    fclose(fp);
    printf("Character: %c\nInteger: %d\nDouble: %lf\n", c, i, d);
}
编辑:如果要查看有关
fscanf
的更多信息,请参阅 EDIT2:二进制解决方案


下面的示例程序
fread()
从命令行上指定的文件中提取第一个
DATASIZE
char
、一个
int
和一个
float

typedef struct Data_s {
  char c;
  int i;
  float f;
} Data_t;

#define DATASIZE 3

int main(int argc, char ** argv) {
  if (1 >= argc) {
    fprintf(stderr, "usage: %s <file name>\n", argv[0]);
    return EXIT_SUCCESS;
  }

  {
    FILE * f = fopen(argv[1], "r");
    if (!f) {
      perror("fopen() failed.");
      return EXIT_FAILURE;
    }

    {
      Data_t data[DATASIZE];
      size_t sizeData = sizeof(*data);
      size_t sizeToRead = sizeof(data)/sizeData;
      memset(data, 0, sizeToRead * sizeData);
      size_t sizeRead = fread(&data, sizeData, sizeToRead, f);
      if (0 != fclose(f))
        perror("fclose() failed,");
      if (sizeToRead != sizeRead) {
        perror("fread() failed.");
        return EXIT_FAILURE;
      }

      for (size_t i = 0; i < sizeToRead; ++ i)
        printf("read c=0x%02hhx, i=%d, f=%f from '%s'\n", data[i].c, data[i].i, data[i].f, argv[1]);
    }
  }

  return EXIT_SUCCESS;
}
typedef结构数据{
字符c;
int i;
浮动f;
}数据;
#定义数据大小3
int main(int argc,字符**argv){
如果(1>=argc){
fprintf(stderr,“用法:%s\n”,argv[0]);
返回退出成功;
}
{
文件*f=fopen(argv[1],“r”);
如果(!f){
perror(“fopen()失败”);
返回退出失败;
}
{
数据[数据大小];
尺寸=尺寸(*数据);
size_t sizeToRead=sizeof(数据)/sizeData;
memset(数据,0,大小读取*大小数据);
size\u t sizeRead=fread(&data,sizeData,sizeToRead,f);
如果(0!=fclose(f))
perror(“fclose()失败,”);
如果(sizeToRead!=sizeRead){
perror(“fread()失败”);
返回退出失败;
}
对于(大小i=0;i
您应该执行与创建文件的程序基本相同的操作,但使用
fread
而不是
fwrite
。速度问题是一个令人费解的问题,如果你对
fread
进行一次或三次调用,它将不会引起注意,特别是因为
fread
正在从缓冲区读取数据,所以在某种程度上它已经在“char buffer”中。它是一个预先创建的二进制文件,大约有1000万行。所以这会有点不同。我只是想知道如何将数据存储到char缓冲区中。以及缓冲区的大小以及如何将它们转换回整数和双精度。我确信它会在时间上产生合理的差异,就像我说的,
fread
是缓冲的,所以它已经从“char缓冲区”中提取数据了。我的建议是你两种方法都试一下,然后计时。如果您确实想知道数据类型的大小,请使用
sizeof
。为二进制文件计算行数有意义吗?
typedef struct Data_s {
  char c;
  int i;
  float f;
} Data_t;

#define DATASIZE 3

int main(int argc, char ** argv) {
  if (1 >= argc) {
    fprintf(stderr, "usage: %s <file name>\n", argv[0]);
    return EXIT_SUCCESS;
  }

  {
    FILE * f = fopen(argv[1], "r");
    if (!f) {
      perror("fopen() failed.");
      return EXIT_FAILURE;
    }

    {
      Data_t data[DATASIZE];
      size_t sizeData = sizeof(*data);
      size_t sizeToRead = sizeof(data)/sizeData;
      memset(data, 0, sizeToRead * sizeData);
      size_t sizeRead = fread(&data, sizeData, sizeToRead, f);
      if (0 != fclose(f))
        perror("fclose() failed,");
      if (sizeToRead != sizeRead) {
        perror("fread() failed.");
        return EXIT_FAILURE;
      }

      for (size_t i = 0; i < sizeToRead; ++ i)
        printf("read c=0x%02hhx, i=%d, f=%f from '%s'\n", data[i].c, data[i].i, data[i].f, argv[1]);
    }
  }

  return EXIT_SUCCESS;
}