Это зависит от того, как struct
определяется, хотите ли вы ваш выход будет читаемый человеком, и подразумевается ли не выходной файл для чтения на другой архитектуре.
Решение fwrite
, которое предоставили другие, будет записывать двоичное представление структуры в выходной файл. Например, если код ниже:
#include <stdio.h>
int main(void)
{
struct foo {
int x;
char name1[10];
char name2[10];
} items[] = {{1,"one","ONE"}, {2,"two","TWO"}};
FILE *output = fopen("binio.dat", "w");
fwrite(items, sizeof items, 1, output);
fclose(output);
return 0;
}
если я отображать содержимое binio.dat
к консоли, я получаю следующее:
[email protected]:~/Development/Prototypes/C/binio$ cat binio.dat
[email protected]:~/Development/Prototypes/C/binio$
[email protected]:~/Development/Prototypes/C/binio$ od -c binio.dat
0000000 001 \0 \0 \0 o n e \0 \0 \0 \0 \0 \0 \0 O N
0000020 E \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000040 \0 \0 \0 \0 002 \0 \0 \0 t w o \0 \0 \0 \0 \0
0000060 \0 \0 T W O \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000100 \0 \0 \0 \0 \0 \0 \0 \0
0000110
Целые значения отображаются как мусор (не воспроизводится выше) потому что они были сохранены в виде последовательностей байтов 01, 00, 00, 00 и 02, 00, 00, 00 (x86 является малорисковым), которые не являются печатными символами. Также обратите внимание, что все 10 символов name1
и все 20 символов name2
записываются в файл, который может быть или не быть тем, что вы хотите.
Ситуация становится еще более сложной, если ваша структура содержит указатели, потому что получает хранится в файле значение указателя, а не вещь, на который указывает на:
#include <stdio.h>
int main(void)
{
struct foo {
int x;
char *name1;
char *name2;
} items[] = {{1,"one","ONE"}, {2,"two","TWO"}};
FILE *output = fopen("binio.dat", "w");
fwrite(items, sizeof items, 1, output);
fclose(output);
return 0;
}
На этот раз я получаю
[email protected]:~/Development/Prototypes/C/binio$ cat binio.dat
��������[email protected]:~/Development/Prototypes/C/binio$
[email protected]:~/Development/Prototypes/C/binio$ od -c binio.dat
0000000 001 \0 \0 \0 260 205 004 \b 264 205 004 \b 002 \0 \0 \0
0000020 270 205 004 \b 274 205 004 \b
0000030
Обратите внимание, что ни одна из строк не отображается в файле вообще; если вы прочитаете этот файл в другой программе, все, что он увидит, являются (скорее всего) неверными адресами.
Если вы хотите, чтобы ваш выход был удобным для чтения и, вы хотите, чтобы иметь возможность считывать эти значения в другой архитектуре, вам почти нужно идти с отформатированным выходом, то есть вам приходится писать каждый член отдельно:
#include <stdio.h>
int main(void)
{
struct foo {
int x;
char *name1;
char *name2;
} items[] = {{1,"one","ONE"}, {2,"two","TWO"}};
FILE *output = fopen("binio.dat", "w");
int i;
for (i = 0; i < sizeof items/sizeof items[0]; i++)
{
fprintf(output, "%d %s %s\n", items[i].x, items[i].name1, items[i].name2);
}
fclose(output);
return 0;
}
[email protected]:~/Development/Prototypes/C/binio$ cat binio.dat
1 one ONE
2 two TWO
можно, конечно, обернуть эту операцию в зависимости от ваших, что-то вроде
int printFoo(FILE *output, const struct foo item)
{
return fprintf(output, "%d %s %s\n", item.x, item.name1, item.name2);
}
, но в конце концов, это примерно так же просто, как и получается.
Решение fwrite
прекрасно работает, если вас не беспокоят читаемость и переносимость, но вы все равно должны быть осторожны, если у вас есть какие-либо элементы-указатели внутри структуры.
Непонятно, что вы просите. Можете ли вы добавить код на свой вопрос, чтобы мы могли лучше его понять? –
Просто передайте указатель структуры инструкции. Вам не нужно писать участников. – Abhineet
Я добавлю позже, теперь я могу использовать только смартфон для Интернета – Mitro