使用getc()顺序读取文本文件,并使用fwrite()在bin文件上写入,是否未按预期工作?

使用getc()顺序读取文本文件,并使用fwrite()在bin文件上写入,是否未按预期工作?,c,C,我正在尝试用C语言编写一个简单的(不是真正的)程序,它利用文件生成一个随机的成分列表,这些成分将来将成为食谱。 我在所有相关函数的帮助下使用文本文件和二进制文件:getc(),fwrite(),fread() 我所尝试的都显示在两个函数的代码中: int convert_txt_to_bin() int打印文件(路径文件路径) 我保证,它们没有那么复杂。 同时,也很抱歉,由于中断而关闭:) 配料 typedef struct { char name[32]; // The name

我正在尝试用C语言编写一个简单的(不是真正的)程序,它利用文件生成一个随机的成分列表,这些成分将来将成为食谱。 我在所有相关函数的帮助下使用文本文件和二进制文件:getc(),fwrite(),fread()

我所尝试的都显示在两个函数的代码中:

  • 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 of
component
,不幸的是,您的代码非常复杂,这使得它不够:(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 . . .