所以我参加了考试,其中一个例子包括扫描二进制文件中的名字。我曾使用fscanf()
,但我的教授告诉我,我不能在二进制文件中使用fscanf。但为什么?即使我这样做,我的程序也能正常工作。
答案 0 :(得分:1)
我承认我没有找到解释fscanf()
和二进制文件错误的方法,但这里有一个例子,说明如何生成binary
文件错误地fscanf()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Entry
{
char text[64];
int age;
};
int main()
{
FILE *file;
struct Entry entry;
file = fopen("data.bin", "wb");
if (file == NULL)
return -1;
entry.age = 30;
memset(entry.text, 0, sizeof(entry.text));
strcpy(entry.text, "Iharob Al Asimi");
fwrite(&entry, sizeof(entry), 1, file);
entry.age = 22;
memset(entry.text, 0, sizeof(entry.text));
strcpy(entry.text, "Claudio Urdaneta");
fwrite(&entry, sizeof(entry), 1, file);
entry.age = 29;
memset(entry.text, 0, sizeof(entry.text));
strcpy(entry.text, "Dayana Orozco");
fwrite(&entry, sizeof(entry), 1, file);
fclose(file);
file = fopen("data.bin", "rb");
if (file == NULL)
return -1;
fprintf(stderr, "with fscanf()\n");
/* this is intentionally == 1 to prove the point */
while (fscanf(file, "%63s%d", entry.text, &entry.age) == 1)
fprintf(stderr, "\t%s, %d\n", entry.text, entry.age);
rewind(file);
fprintf(stderr, "with fscanf()\n");
while (fread(&entry, sizeof(entry), 1, file) == 1)
fprintf(stderr, "\t%s, %d\n", entry.text, entry.age);
fclose(file);
return 0;
}
问题是fscanf()
将扫描文本并与您传递给它的说明符匹配。
但是二进制文件只是存储在给定结构中的一堆字节,在上面的例子中我们每条记录写64 + sizeof(int)
个字节,其中一个项只是文本所以用fscanf()
读取字节按预期工作,它当然会停留在空白角色。
但是该数字在文件中没有文本重新表示,因此您无法使用fscanf()
阅读它。
另外,请注意这个
while (fscanf(file, "%63s%d", entry.text, &entry.age) == 1)
正确的做法是
while (fscanf(file, "%63s%d", entry.text, &entry.age) == 2)
但是不会打印任何内容,因为整数不匹配。
因此,在使用二进制文件时,您需要
fread()
/ fwrite()
而数据只是文本
fprintf()
/ fscanf()
会很好。