2013-03-20 2 views
-2

В моей программе я получаю ввод с клавиатуры. Я положил этот ввод в struct, который содержит два поля char и поле 1 int. Как я могу написать во всем struct, используя только функцию?Как написать полную структуру в файле?

I не хотите написать каждому члену struct отдельно.

+0

Непонятно, что вы просите. Можете ли вы добавить код на свой вопрос, чтобы мы могли лучше его понять? –

+1

Просто передайте указатель структуры инструкции. Вам не нужно писать участников. – Abhineet

+0

Я добавлю позже, теперь я могу использовать только смартфон для Интернета – Mitro

ответ

1

Это зависит от того, как 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 прекрасно работает, если вас не беспокоят читаемость и переносимость, но вы все равно должны быть осторожны, если у вас есть какие-либо элементы-указатели внутри структуры.

4

C не имеет «инструкций».

Вы должны быть в состоянии использовать вызов функции, такие как:

fwrite(&mystructure, sizeof mystructure, 1, myfile); 

Но это не без недостатков:

  1. Это делает файл-формат зависит от текущего CPU и компилятор, который часто является плохой идеей; это затруднит сохранение совместимости.
  2. Возможно, запись может быть успешной; вам нужно обернуть его в цикл для этого случая.
Смежные вопросы