Запись структуры в файл на C - PullRequest
4 голосов
/ 21 июня 2011

Я работаю на C / UNIX и у меня есть входной файл с количеством записей.Я сопоставил каждую запись со структурой и записал структуру в выходной файл, добавив отсутствующую информацию в запись из базы данных.

Моя проблема заключается в записи структуры (состоящей из символьных массивов) обратно в файл.Я использую

    fwrite(&record, sizeof(record), 1, out);
    fwrite("\n", 1, 1, outfd);

Это запишет данные в выходной файл с завершающим NULL '\ 0' после каждого члена.Пожалуйста, дайте мне знать, как я могу записать эту структуру в файл, не заканчивая '\ 0' после каждого члена.

Ответы [ 2 ]

5 голосов
/ 21 июня 2011

Я бы предположил, что эти 0 являются частью символьных массивов - они находятся в конце каждой строки C. Если вам нужно записать строки в файл без нулей, вы можете написать отдельные массивы символов, записывая только символы, а не конечный ноль (вы можете использовать strlen(), чтобы найти эту длину), т. Е.

fwrite (theCharArray, 1, strlen (theCharArray), out);

Но тогда вам может потребоваться записать некоторую информацию о длине каждой строки в файл.

3 голосов
/ 21 июня 2011

Это будет записывать record в точности так, как оно хранится в памяти - но компилятор свободен для вставки отступов между членами, и если это произойдет, это запишет все значения, которые будут в этих байтах заполнения.

Многие (большинство?) Компиляторы имеют непереносимые способы запрета вставки этих отступов - MSVC использует #pragma pack(1), gcc использует __attribute(__packed__) (и по крайней мере некоторые версии поддерживают синтаксис #pragma pack какхорошо).

Также возможно, что вы определили record, чтобы включить в данные некоторые нулевые байты (например, массивы char с нулевыми терминаторами, чтобы сделать их строками).Поскольку вы не показали определение record, трудно предположить, применимо ли это к делу или нет.

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

Наиболее очевидная возможность - предшествовать каждому полю его длиной.Это имеет то преимущество, что если / когда вы хотите искать файл, вы можете переходить от одного поля к другому, не читая данные, чтобы найти завершающий байт.Однако обычно вместо этого я бы использовал индекс - файл, содержащий смещения файлов для последовательных записей в данных (и, возможно, некоторые ключевые данные для каждой записи, чтобы вы могли быстро выполнять поиск на основе содержимого записей), поэтомуВы можете быстро найти местоположение записи и прочитать ее данные.Если у вас нет необычайно больших полей, поиск отдельных полей редко приводит к большим результатам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...