Запись данных из связанного списка в двоичный файл с использованием fwrite.

Я не знаю, как подойти к этой задаче.

Я специально должен использовать fwrite, но моя проблема в том, что я не знаю, как писать разные типы файлов (char [], int, double) в одну строку в двоичном файле, увеличивать ее, а затем записывать следующую партию данных из связанного списка увеличьте его ….. и так далее.

Приведенный ниже код записывает данные из связанного списка (данные) в текстовый файл, переходит к следующей строке и повторяет процесс до тех пор, пока последний элемент списка не будет записан в текстовый файл.

Мне нужно закодировать функцию, которая имеет те же принципы, но записывает данные из связанного списка в двоичный файл, используя 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 times и т. Д.

вы хотите сделать что-то вроде:

 fwrite (Data , sizeof(ListDataType), 1, fileHandle); 

это будет записывать байты 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 

поэтому вместо одиночного fprintf у вас будет несколько сценариев для разных данных, обратите внимание на различные виды вычислений длины (strlen + 1 или sizeof) и нужно ли добавлять & не добавлять