使用fread将数据存储到char缓冲区中
我正在做一个项目,需要从二进制文件中读取数据。我试图将数据存储到一个字符缓冲区中。假设二进制文件由一个字符、一个int和一个double组成,字符缓冲区需要多大?我如何转换回int和double 我正在将数据读入一个字符缓冲区,因为这样可以提高程序的速度使用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
谢谢 您可以使用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;
}