Search code examples
cfunctionstructureextern

Structure as a parameter of extern function C


I have to read a text file using this structure. Also, I have to use external functions. I made the code for file reading and it works in main function.

Text file:

banana 3 orange 8 music 9- first character is a blank space*

#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++;
     }
}

But when I try to make this reading using another c file and extern function it's no working.. :(

This is what is written in 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++;
 }
}

And fileReading.h:

void fileReading(struct fisier *, FILE *);

And in 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);
}

When I compile it, it says:

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) ===||

Can you help me, please? Thank you!


Solution

  • From what I see it looks like you do not have a good understanding of pointers. These changes should solve your problem:

    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);
    }
    

    What you did wrong:

    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