Язык C, структура файлов - PullRequest
1 голос
/ 19 января 2012

Я пытаюсь создать структуру, которая содержит два файловых указателя.(См. Ниже)

    typedef struct dataFiles
    {
        FILE * inputSet;
        FILE * outputSet;
    }fData;

Я хотел бы использовать эту функцию, чтобы использовать функцию для открытия и закрытия файлов, у меня есть одна прямо здесь:

    void openFiles(struct dataFiles * fiData)
    {
        fiData->inputSet = fopen("inputfile.txt","r");
        fiData->outputSet = fopen("outputfile.txt","o");
        return fiData;
    }

ВОсновная функция Сначала я объявляю структуру как:

    fdata * fileData;

, затем пытаюсь получить к ней доступ через:

    openFiles(&fileData);

моя программа запускается и компилируется, но у меня возникают проблемы с получением данных изinputfile в структуру, когда я проверяю свой вывод, это все 0.Буду признателен за любые общие советы о том, как реализовать этот тип кода.(Примечание. Это вопрос к школьному заданию, однако я уже выполнил требования к заданию и просто заинтересован в этом для своего собственного любопытства) ~ Спасибо!

Ответы [ 4 ]

1 голос
/ 19 января 2012

объявляйте это как:

fdata fileData; //This memory is on the stack, not the heap

Память может находиться в двух местах, в стеке и в куче.Память в стеке не должна выделяться, вам просто нужно получить ссылку на нее.Следовательно, &fileData даст вам нужный вам указатель.Однако вы не можете вернуть указатель на данные в стеке.Поэтому вам нужен указатель на кучу.Чтобы создать указатель на память в куче, вы вызываете malloc с нужным вам объемом памяти.В этом случае это malloc(sizeof(fileData)).Это возвращает void *, который вам нужно будет преобразовать в fileData *.

и также изменить

 void openFiles(struct dataFiles * fiData)
на
 fData openFiles(struct dataFiles * fiData)
0 голосов
/ 19 января 2012

У вас проблема с типом.openFiles должен получить fData*, но вы передаете ему fData**.Вы должны сделать что-то вроде:

fileData=malloc(sizeof(fData));
openFiles(fileData);

edit: или просто изменить тип на fileData на fData и передать его адрес.

0 голосов
/ 19 января 2012

Вы смешиваете указатели с переменными.Чтобы ваша функция работала, вы должны объявить fileData следующим образом:

fdata fileData;

(без указателя) и удалить return в openFiles.Это не нужно, так как аргумент изменяется по ссылке.

0 голосов
/ 19 января 2012

Скорее, объявите его как

fdata fileData;

, тогда

openFiles(&fileData);

Если вы объявите fileData как fdata *, тогда &fileData будет иметь тип fdata **, который будетне соответствует типу вашего параметра функции.

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