c - 如何从二进制文件读取到 C 中的文本文件?

标签 c file binary text-files binaryfiles

我在从二进制文件复制和写入文本文件时遇到问题。我编写了一个能够从文本文件复制并写入二进制文件的程序,但我不能执行相反的操作。

这是我遇到问题的函数:

void CopyBin2Text(char* rafname, char* txtname)
{

FILE * fraf = fopen(rafname,"rb");
FILE * ftxt = fopen(txtname,"r+");

//READ FROM BINARY FILE
struct PERSON p;
int ByteOfBin;


printf("ID \t NAME \t\t BALANCE \n");
printf("---------------------------------------\n");

当我运行我的程序时,它在打印上述语句后停在这里

  while(!feof(fraf))
  {
       fscanf(fraf, "%d %s %f", &p.ID, p.name, &p.balance);

    ByteOfBin = ((p.ID/10-1)*sizeof(p));
    fseek(ftxt,ByteOfBin, SEEK_SET);
    fwrite((char *)&p, sizeof(p), 1, ftxt);

  }


fclose(fraf);
fclose(ftxt);
}

我注意到的另一个问题是文本文件变得太大而无法打开。结果是我必须删除文本文件并重新创建它。 任何人都可以解释导致这种情况发生的原因吗?

最佳答案

我对你的功能做了一些修改。文件打开方式,检查是否打开,转储feof(),使用适当的二进制和文本函数进行读写,并返回函数是否​​正常运行的状态。

#include <stdio.h>
#include <string.h>

struct PERSON {
    int ID;
    char name[20];
    float balance;
};

int CopyBin2Text(char* rafname, char* txtname)      // changed return value
{
    FILE *fraf, *ftxt;
    struct PERSON p;
    if ((fraf = fopen(rafname,"rb")) == NULL)
        return 0;                                   // failure

    if ((ftxt = fopen(txtname,"wt")) == NULL) {     // changed mode
        fclose(fraf);
        return 0;                                   // failure
    }
    fprintf(ftxt, "ID\tNAME\tBALANCE\n");
    fprintf(ftxt, "---------------------------------------\n");
    while(fread(&p, sizeof(p), 1, fraf) == 1)       // use return value to loop
        fprintf(ftxt, "%d\t%s\t%.2f\n", p.ID, p.name, p.balance);
    fclose(ftxt);

    fclose(fraf);
    return 1;                                       // success
}

int makefile(char* rafname)
{
    FILE *fraf, *ftxt;
    struct PERSON p = {1,"alpha", 123.45};
    struct PERSON q = {2,"beta",  100.00};
    struct PERSON r = {3,"gamma", 9.99};
    if ((fraf = fopen(rafname,"wb")) == NULL)
        return 0;                                   // failure
    fwrite(&p, sizeof(p), 1, fraf);
    fwrite(&q, sizeof(q), 1, fraf);
    fwrite(&r, sizeof(r), 1, fraf);
    fclose(fraf);
    return 1;                                       // success
}

int main(void)
{
    if (makefile("file.bin") == 0)
        printf("Failure\n");
    else {
        if (CopyBin2Text("file.bin", "file.txt") == 0)
            printf("Failure\n");
        else
            printf("Success\n");
    }
    return 0;
}

输出文本文件是

ID  NAME    BALANCE
---------------------------------------
1   alpha   123.45
2   beta    100.00
3   gamma   9.99

关于c - 如何从二进制文件读取到 C 中的文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33252160/

相关文章:

c++ - 将数字写入文件而不是读取它们的最佳解决方案是什么?

python - 将二进制转换为十进制整数输出

arrays - 将字符串转换为位序列,反之亦然

c - struct args 中的函数指针?

c - 为什么有些函数不涉及内核?

python - 从元组列表中提取数据

c++ - 是否有任何关于如何设计数据文件结构的引用/资源?

c - 如何在 C 中初始化/重置数据结构数组

c - 为什么 boolean 数据类型没有在 C 中实现

c - 有没有来自标准输入的东西?