2015-10-01 1 views
0

Мне нужно создать структуру FILE из данных, хранящихся в массиве. В моем коде у меня есть функция fopen, которая возвращает FILE. Идея состоит в том, чтобы прочитать все данные, хранящиеся в массиве, преобразовать в структуру FILE и, наконец, вернуть FILE.fopen - необработанные данные как данные потока в C

т.е:

FILE validFile (char *fileName){ 
    char *data; 
    FILE *fp; 

    data = malloc(sizeof(char*)); 

    populateData(data); 

    fp = fopen(data, "r"); 

    return fp; 
} 

Возможно ли это?

С наилучшими пожеланиями, Cristian.

+0

Каких операционной системы вы работаете? POSIX предоставляет решение для этого, хотя я не уверен в Windows. – fuz

+0

fp - ФАЙЛ *, а не ФАЙЛ –

ответ

2

Да, это возможно, хотя и не с чистым C. Если вы программируете для Unix-подобной операционной системы, как Linux, вы можете использовать функцию fmemopen из POSIX:

FILE validFile (char *fileName){ 
    char *data; 
    FILE *fp; 

    data = populateData(); 

    /* data_size is the length of the buffer */ 
    fp = fmemopen(data, data_size, "r"); 

    return fp; 
} 
-2

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

Вы можете вернуть fp, если вы измените свой класс хранения, это сфера, передать его в качестве параметра, выделить его с malloc(), calloc() ... Что-то вроде этого, например:

FILE **validFile (char *fileName){ 
    char *data; 
    FILE **fpp; 

    if (fpp = (FILE **)calloc(1,sizeof(FILE *))) { 

     data = (char *)malloc(sizeof(char*)); 

     populateData(data); 

     if ((*fpp = fmemopen(data, data_size, "r"))) { 

      /* 
      */ 

     } else { 

      /* 
      */ 

     } 

    } else { 
     /* 
     * calloc() failed... 
     */ 
    } 

    return *fpp; 
} 
+0

Привет Ларри. Спасибо за вашу помощь. Я программирую в стандартном C, у меня нет доступа к fmemopen. Можно ли предоставить мне реализацию функции fmemopen, чтобы перенести ее в мой проект? Где я могу найти исходный код? Спасибо и всего наилучшего. Cristian. – cristiancrm

+1

Ваш первый абзац просто неверен - да 'fp' - это локальная переменная, но она возвращается значением, а не ссылкой, поэтому здесь нет ссылок. Выделение дополнительной памяти для ее удержания просто утечки памяти и не обеспечивает ничего положительного. –

+0

@cristiancrm Какую операционную систему вы программируете? Этот вопрос имеет решающее значение. – fuz