2015-10-21 195 views
0

我无法从二进制文件复制并写入文本文件。我写了一个能够从文本文件复制并写入二进制文件的程序,但我无法做到相反。如何从二进制文件读取C文本文件?

这里是我有问题,我的功能:

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); 
} 

另一个问题之后我注意到,文本文件变得很大以至于打开。结果是我必须删除文本文件并重新创建它。 任何人都可以解释是什么导致这种情况发生?

+0

你说你读的是二进制文件,但你尝试从它像一个文本文件中读取? *和*你写入文本文件就像一个二进制文件? –

+2

像fscanf()这样的函数并没有设计用于处理二进制文件。他们期望文本,应该在由语言支持的特定标准中提供。 – Havenard

+1

看看[**为什么是“while(!feof(file))”总是错的?**](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always -wrong?s = 1 | 2.6488)你需要检查'fscanf'的返回值(你可能应该从二进制文件中读取char-by-char'或者使用'fread'而不是'fscanf' - 是格式化文本...) –

回答

2

我对你的功能做了许多改变。文件打开模式,检查它们是否打开,转储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