如何在C中从二进制文件读取到文本文件?
我在从二进制文件复制和写入文本文件时遇到问题。我已经写了一个程序,能够从文本文件复制并写入二进制文件,但我不能做相反的事情 以下是我遇到的问题:如何在C中从二进制文件读取到文本文件?,c,file,binary,text-files,binaryfiles,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;
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;
}
我对你的功能做了一些更改。文件打开模式,检查它们是否打开,转储
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;
}
你说你读的文件是二进制的,但是你试图像文本文件一样从中读取?然后像二进制文件一样写入文本文件?像
fscanf()
这样的函数不是为处理二进制文件而设计的。他们需要文本,这些文本应该以该语言支持的特定标准提供。请看一看,您需要检查fscanf
的返回(并且您可能应该从二进制文件中逐字符读取char
,或者使用fread
而不是fscanf
,后者用于格式化文本…)我用以下语句替换了fscanf
:fread((char*)&p,sizeof(p),1,fraf)
和二进制文件中的内容显示在文本文件中,但它是二进制格式而不是文本格式。如果您希望输出文件为文本格式,则必须使用文本写入功能将p
的每个字段写入其中,例如fprintf(ftxt,“%d\t”,p.ID)
您说您读取的文件是二进制的,但是你试着像读取文本文件一样读取它?然后像二进制文件一样写入文本文件?像fscanf()
这样的函数不是为处理二进制文件而设计的。他们需要文本,这些文本应该以该语言支持的特定标准提供。请看一看,您需要检查fscanf
的返回(并且您可能应该从二进制文件中逐字符读取char
,或者使用fread
而不是fscanf
,后者用于格式化文本…)我用以下语句替换了fscanf
:fread((char*)&p,sizeof(p),1,fraf)
和二进制文件中的内容显示在文本文件中,但它是二进制格式而不是文本格式。如果您希望输出文件为文本格式,则必须使用文本写入功能,如fprintf(ftxt,“%d\t”,p.ID)