我不知道如何处理这项任务。
我特别要使用fwrite,但我的问题是,我不知道如何将不同的文件类型(char[],int,double)写入二进制文件中的单行,递增它,然后从链表中写入下一批数据递增它……等等。
下面的代码将链表(Data)中的数据写入文本文件,转到下一行并重复该过程,直到列表的最后一个元素被写入文本文件。
我需要编写一个具有相同原理的函数,但使用fwrite将链表中的数据写入二进制文件。伙计们,有什么想法吗?
void WriteTextFile(ListDataType *Data, int numEl)
{
FILE *textfile;
char name[50];
printf("\n\nWhat would you like to call the text file in which the data will be stored?\nNB remember to add \".txt\" after your chosen name!!!\nENTER NAME NOW>>");
scanf("%s", name);
textfile = fopen(name, "w+");
do
{
fprintf(textfile, "%s %d %d %.2lf %.2lf %.2lf %.2lf\n", Data->component.name, Data->component.int1, Data->component.int2, Data->component.double1, Data->double2, Data->double3, Data->double4 );
Data = Data->nextPtr;
}while(Data != NULL);
fclose(textfile);
}
由于您有一项可变长度数据(动态分配的字符串指针),您必须决定如何在二进制文件中管理它。您可以在输出中为结构内的名称留出固定长度的空间。或者您可以编写一个以零结尾的字符串并以这种方式管理它。我将选择第二种情况,因为它更符合动态字符串。
这有点冗长,因为问题陈述中没有给出结构的性质。所以下面将以任意顺序处理结构元素。
void WriteBinaryFile(ListDataType *Data, int numEl)
{
FILE *bin_file;
char name[50];
printf("\n\nWhat would you like to call the binary file in which the data will be stored?\n"
printf("NB remember to add \".txt\" after your chosen name!!!\nENTER NAME NOW>>");
scanf("%s", name);
bin_file = fopen(name, "wb+");
do
{
//NOTE: include terminating zero in the string output; assumes single-byte chars
fwrite(Data->component.name, strlen(Data->component.name)+1, 1, bin_file);
fwrite(&Data->component.int1, sizeof(Data->component.int1), 1, bin_file);
fwrite(&Data->component.int2, sizeof(Data->component.int2), 1, bin_file);
fwrite(&Data->component.double1, sizeof(Data->component.double1), 1, bin_file);
fwrite(&Data->component.double2, sizeof(Data->component.double2), 1, bin_file);
fwrite(&Data->component.double3, sizeof(Data->component.double3), 1, bin_file);
fwrite(&Data->component.double4, sizeof(Data->component.double4), 1, bin_file);
Data = Data->nextPtr;
} while(Data != NULL);
fclose(bin_file);
}
如果一个程序需要读回它,它会首先读取一个名称并读取字符,直到找到0
。然后它会根据其他元素的数据类型读取它们。这个过程将对编写的每个结构重复进行。不过,这不一定是可移植的。你必须小心int time的大小等。
你会想做这样的事情:
fwrite (Data , sizeof(ListDataType), 1, fileHandle);
这将从Data指向的任何位置开始写入sizeof(ListDataType)字节。如果您的Data对象中有任何指针-您需要定义一个新的结构,将值复制到该结构,然后写入新的结构。
如果您无法为动态字符串定义最大长度,那么您可以定义一个包含字符串长度的结构-写入结构,然后写入字符串-这样您就会知道要读回多少字节。无论哪种方式,结构都是读取和写入bin文件的最佳方式。
好的-带有示例的编辑…
如果您像这样定义组件结构:
typedef struct Component_Struct
{
int int1;
int int2;
double double1;
double double2;
double double3;
double double4;
int nameLen;
char* name;
}
COMPONENT, *LPCOMPONENT;
请注意额外的nameLen-在将值分配给结构时填充此值。
然后在你的写函数中:
FILE * pFile;
pFile = fopen ("myfile.bin", "wb");
do
{
fwrite(Data->Component, sizeof(COMPONENT)-sizeof(char*), 1, pFile)
fwrite(Data->Component.name, sizeof(char), Data->Component.nameLen, pFile)
Data = Data->nextPtr;
}
while(Data !=NULL);
fclose (pFile);
您应该以不同的方式编写不同的组件,检查示例:
fwrite(Data->stringcomponent, strlen(Data->stringcomponent)+1, 1, binaryfile); // writes 1 string
fwrite(&Data->doublecomponent, sizeof(double), 1, binaryfile); // writes 1 double
fwrite(&Data->intcomponent, sizeof(int), 1, binaryfile); // writes 1 int
因此,对于不同的数据,您将有多个fwrite,而不是单个fprintf,请注意不同类型的长度计算(strlen 1或sizeof)以及您是否必须添加