使用getc()顺序读取文本文件,并使用fwrite()在bin文件上写入,是否未按预期工作?
我正在尝试用C语言编写一个简单的(不是真正的)程序,它利用文件生成一个随机的成分列表,这些成分将来将成为食谱。 我在所有相关函数的帮助下使用文本文件和二进制文件:getc(),fwrite(),fread() 我所尝试的都显示在两个函数的代码中:使用getc()顺序读取文本文件,并使用fwrite()在bin文件上写入,是否未按预期工作?,c,C,我正在尝试用C语言编写一个简单的(不是真正的)程序,它利用文件生成一个随机的成分列表,这些成分将来将成为食谱。 我在所有相关函数的帮助下使用文本文件和二进制文件:getc(),fwrite(),fread() 我所尝试的都显示在两个函数的代码中: int convert_txt_to_bin() int打印文件(路径文件路径) 我保证,它们没有那么复杂。 同时,也很抱歉,由于中断而关闭:) 配料 typedef struct { char name[32]; // The name
- int convert_txt_to_bin()
- int打印文件(路径文件路径)
typedef struct {
char name[32]; // The name of the ingredient: "Mela", "Fusilli", "Passata di pomodoro";
int type;
} ingredient;
21种水果中有19种被成功记录。
我不明白为什么Pera(梨)和Banana(猜怎么着)保存不正确,并导致输出出现问题
输出到标准输出:
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
.bin file written correctly
19 records saved
Ingredient number #0 <------------------------------ Perana ???
Perana Name = Mela
Type = 0
Ingredient number #1
Name = Kiwi
Type = 0
Ingredient number #2
Name = Pesca
Type = 0
Ingredient number #3
Name = Albicocca
Type = 0
Ingredient number #4
Name = Mandarino
Type = 0
Ingredient number #5
Name = Uva
Type = 0
Ingredient number #6
Name = Ciliegia
Type = 0
Ingredient number #7
Name = Lampone
Type = 0
Ingredient number #8
Name = Fragola
Type = 0
Ingredient number #9
Name = Mora
Type = 0
Ingredient number #10
Name = Mirtillo
Type = 0
Ingredient number #11
Name = Fico
Type = 0
Ingredient number #12
Name = Nespola
Type = 0
Ingredient number #13
Name = Caco
Type = 0
Ingredient number #14
Name = Anguria
Type = 0
Ingredient number #15
Name = Melone
Type = 0
Ingredient number #16
Name = Melograno
Type = 0
Ingredient number #17
Name = Arancia
Type = 0
Ingredient number #18
Name = Mango
Type = 0
Premere un tasto per continuare . . .
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
记录写入成功
.bin文件写入正确
已保存19条记录
成分编号#0评论中有一些好的建议,但很可能您报告的问题与其说是编程问题,不如说是数据文件的问题。在打印Mera
的行上叠加Banana
和Pera
,强烈表明文件中的前两行没有正确地以换行符结尾,而是以回车符结尾
我真的不知道这些天怎么会发生这种事。二十年前,苹果的操作系统使用CR行结尾,但当苹果在FreeBSD上重新调整操作系统时,情况发生了变化。Windows仍然使用两个字符的CR-LF序列来表示换行符,但由于其中包含\n
,因此不应导致此特定问题
因此,我只能建议您使用十六进制编辑器检查输入文件(或者使用hd
查看输入文件)并查看行末尾的字符代码 Post def ofcomponent
,不幸的是,您的代码非常复杂,这使得它不够:(OT:关于:txt=fopen(file_list_fruits_txt,“r”)
和bin=fopen(file_list_fruits_bin,“wb”)
调用fopen()
时,始终选中(!=NULL)确保操作成功。如果未成功(返回值为NULL),则调用peror(“您的错误消息”);
以输出错误消息和系统认为错误发生在stderr
的文本原因。函数:getc()
返回一个int
,而不是char
,宏:EOF
是一个int
,而不是char
。因此此语句:if(c==EOF)break;
和此语句:if(tmp.name[i]='\n'| tmp.name[i]==EOF)
将(最有可能)检查EOF
@user3629249时失败嘿,非常感谢,真的:)所以你建议:1)检查所有空返回2)向结构添加标记3)使用int-var检查EOF 4)初始化结构我解决了它,在“坏行”之后只有0D十六进制值或CR。另一方面,在正确的行有一个CRLF序列。我必须手动添加一个LF值,我不知道它是如何被删除或从未添加的。也许是因为我用记事本打开的,不知道,真的
int print_ingredient_file(path file_path)
{
FILE* bin;
ingredient tmp;
int i = 0;
bin = fopen(file_path, "rb");
while (fread(&tmp, sizeof(ingredient), 1, bin))
printf("Ingredient number #%d\n\tName = %s\n\tType = %d\n", i++, tmp.name, tmp.type);
fclose(bin);
}
fruits.txt (it's in italian)
Mela
Banana
Pera
Kiwi
Pesca
Albicocca
Mandarino
Uva
Ciliegia
Lampone
Fragola
Mora
Mirtillo
Fico
Nespola
Caco
Anguria
Melone
Melograno
Arancia
Mango
fruits.bin
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
Record written successfully
.bin file written correctly
19 records saved
Ingredient number #0 <------------------------------ Perana ???
Perana Name = Mela
Type = 0
Ingredient number #1
Name = Kiwi
Type = 0
Ingredient number #2
Name = Pesca
Type = 0
Ingredient number #3
Name = Albicocca
Type = 0
Ingredient number #4
Name = Mandarino
Type = 0
Ingredient number #5
Name = Uva
Type = 0
Ingredient number #6
Name = Ciliegia
Type = 0
Ingredient number #7
Name = Lampone
Type = 0
Ingredient number #8
Name = Fragola
Type = 0
Ingredient number #9
Name = Mora
Type = 0
Ingredient number #10
Name = Mirtillo
Type = 0
Ingredient number #11
Name = Fico
Type = 0
Ingredient number #12
Name = Nespola
Type = 0
Ingredient number #13
Name = Caco
Type = 0
Ingredient number #14
Name = Anguria
Type = 0
Ingredient number #15
Name = Melone
Type = 0
Ingredient number #16
Name = Melograno
Type = 0
Ingredient number #17
Name = Arancia
Type = 0
Ingredient number #18
Name = Mango
Type = 0
Premere un tasto per continuare . . .