2016-01-10 18 views
1

Мне нужно прочитать текстовый файл, используя эту структуру. Кроме того, я должен использовать внешние функции. Я сделал код для чтения файлов, и он работает в основной функции.Структура как параметр функции extern C

Текстовый файл:

banana 3 orange 8 music 9 - первый символ пробел *

#include <stdio.h> 
#include <stdlib.h> 

struct file 
{ 
    char name[30]; 
    char size; 
}; 


int main() 
{ 
    int n=0; 
    struct file f[30]; 
    FILE *files; 
    files=fopen("files.txt","r"); 
    int n=0; 
    while (1) 
    { 
     fgetc(files); 
     if(feof(files)) break; 
     fscanf(files,"%s %c",&f[n].name,&f[n].size); 
     n++; 
    } 
} 

Но когда я пытаюсь сделать это чтение с использованием другого файла Си и Экстерн функции это не рабочая .. :(

Это то, что написано в filereading.c:

void fileReading(struct file *f[30], FILE *files) 
{ 
    int n=0; 
while (1) 
{ 
    fgetc(files); 
    if(feof(files)) break; 
    fscanf(files,"%s %c",&f[n].name,&f[n].size); 
    n++; 
} 
} 

И fileReading.h:

void fileReading(struct fisier *, FILE *); 

И в main.c:

#include <stdio.h> 
#include <stdlib.h> 

struct file 
{ 
    char name[30]; 
    char size; 
}; 


int main() 
{ 
    int n=0; 
    struct file f[30]; 
    FILE *files; 
    files=fopen("files.txt","r"); 
    fileReading(f[30],files); 
} 

Когда я компилирую его, он говорит:

request for member 'name' in something not a structure or union 
request for member 'size' in something not a structure or union| 
||=== Build finished: 2 errors, 2 warnings (0 minutes, 0 seconds) ===|| 

Можете ли вы помочь мне, пожалуйста? Спасибо!

+0

'недействительным fileReading (структура файла * е [30], FILE * файлы)' '-> недействительным fileReading (struct file f [30], файлы FILE *), 'fileReading (f [30], файлы);' -> 'fileReading (f, files);' – BLUEPIXY

ответ

2

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

void fileReading(struct file *f, FILE *files) 
{ 
    int n=0; 
while (1) 
{ 
    fgetc(files); 
    if(feof(files)) break; 
    fscanf(files,"%s %c",f[n].name,&f[n].size); 
    //printf("%s %c",f[n].name,f[n].size); 
    n++; 
} 
} 
int main() 
{ 
    int n=0; 
    struct file f[30]; 
    FILE *files; 
    files=fopen("files.txt","r"); 
    fileReading(f,files); 
} 

Что вы сделали неправильно:

void fileReading(struct file *f[30], FILE *files) //here you were saying file is a ** 
fscanf(files,"%s %c",&f[n].name,&f[n].size); // here you need to send the a char* but you were sending a char ** as a second parameter 
fileReading(f[30],files); // here you were sending the 31th element of the structure array f which by the way doesn't exist (indexing is from 0 , f[29] is the last) even though that was not what you wanted to do in the first place 
1

Файл fileReading.c не знает определения struct file. Вам нужно перенести его с main.c на fileReading.h и #include "fileReading.h" в main.c и fileReading.c.

Кроме того, определение и вызов fileReading неверны. Вместо того, чтобы:

void fileReading(struct file *f[30], FILE *files) 

Вы хотите:

void fileReading(struct file *f, FILE *files) 

И вы называете это так:

fileReading(f,files); 

Это неверно:

fileReading(f[30],files); 

Поскольку вы передаете один struct file вместо массива, и единственный экземпляр, который вы передаете, - это один элемент с конца массива (поскольку размер 30, действительные индексы - 0-29), что может привести к неопределенному поведению.

+0

Когда я включаю 'fileReading.h' в' main.c' и 'fileReading.c' он говорит следующее: ' fisiere.h: Нет такого файла или каталога | || === Сборка завершена: 1 ошибка, 0 предупреждений (0 минут, 0 секунд) === | ' – ProgrammingFailure

+0

@ProgrammingFailure Итак, вы заголовочный файл с именем fileReading.h или fisiere.h?Как бы то ни было, убедитесь, что файл находится в том же каталоге, что и файлы .c, и что настоящее имя файла включено в оба исходных файла. – dbush

+0

@ProgrammingFailure При публикации кода отправьте свой * фактический * код с помощью copy/paste, а не на то, что вы ввели отдельно или внесли дополнительные изменения. – dbush