Search code examples
cpointersstrtokstrcpy

Incompatible pointer type file txt for loop


I am getting an error for the below code. I was wondering if I am missing memory allocation or what could be the pointer issue. Any help would be wonderful , thank you

#include <stdio.h>
#include <string.h>
#define MAX_ITEM_NAME_STRING    25
#define MAX_ITEM_DESCRIPTION_STRING     80

typedef struct 
{
    char name[MAX_ITEM_NAME_STRING]; //25 value
    char description[MAX_ITEM_DESCRIPTION_STRING]; //80 value
}Item;

int ItemReadItems(Item *items[], int maxItems, char *filename){
    FILE * itemFile = fopen(filename, "r");
    // file is 6 lines "comb","a small comb"[![enter image description here][1]][1]
    char ch;// loads a list of items from a txt file with comma delimited fields
    char line[MAX_ITEM_DESCRIPTION_STRING + MAX_ITEM_NAME_STRING + 10];
    int i =0;
    if(itemFile == NULL)
    { return -1;}// if not able reutrn -1 unable to open
    for(i<maxItems; i++)
    {// fills item array items with contents of a file from items.txt
        
        while(fgets(line, sizeof(line), itemFile) != NULL){
          strcpy(items[i]->name, strtok(line, ","));
          strcpy(items[i]->description, strtok(line, ","));
        }
    }
    fclose(itemFile);
    return i;// return a # of objects loaded from filename   
}

Error:

/mnt/c/Users/liloc/Documents/CSCV352/Exercise 6 Files/Exercise6_1/Item.c: In function ‘ItemReadItems’:
/mnt/c/Users/liloc/Documents/CSCV352/Exercise 6 Files/Exercise6_1/Item.c:15:15: warning: passing argument 1 of ‘fgets’ from incompatible pointer type [-Wincompatible-pointer-types]
   15 |         fgets(line, sizeof(line), itemFile);
      |               ^~~~
      |               |
      |               char **
In file included from /mnt/c/Users/liloc/Documents/CSCV352/Exercise 6 Files/Exercise6_1/Item.h:3,
                 from /mnt/c/Users/liloc/Documents/CSCV352/Exercise 6 Files/Exercise6_1/Item.c:1:
/usr/include/stdio.h:564:14: note: expected ‘char * restrict’ but argument is of type ‘char **’
  564 | extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
      |              ^~~~~
/mnt/c/Users/liloc/Documents/CSCV352/Exercise 6 Files/Exercise6_1/Item.c:16:39: warning: passing argument 1 of ‘strtok’ from incompatible pointer type [-Wincompatible-pointer-types]
   16 |         strcpy(items[i]->name, strtok(line, ","));
      |                                       ^~~~
      |                                       |
      |                                       char **
In file included from /mnt/c/Users/liloc/Documents/CSCV352/Exercise 6 Files/Exercise6_1/Item.h:4,
                 from /mnt/c/Users/liloc/Documents/CSCV352/Exercise 6 Files/Exercise6_1/Item.c:1:
/usr/include/string.h:336:14: note: expected ‘char * restrict’ but argument is of type ‘char **’
  336 | extern char *strtok (char *__restrict __s, const char *__restrict __delim)
      |              ^~~~~~
/mnt/c/Users/liloc/Documents/CSCV352/Exercise 6 Files/Exercise6_1/Item.c:17:46: warning: passing argument 1 of ‘strtok’ from incompatible pointer type [-Wincompatible-pointer-types]
   17 |         strcpy(items[i]->description, strtok(line, ","));
      |                                              ^~~~
      |                                              |
      |                                              char **
In file included from /mnt/c/Users/liloc/Documents/CSCV352/Exercise 6 Files/Exercise6_1/Item.h:4,
                 from /mnt/c/Users/liloc/Documents/CSCV352/Exercise 6 Files/Exercise6_1/Item.c:1:
/usr/include/string.h:336:14: note: expected ‘char * restrict’ but argument is of type ‘char **’
  336 | extern char *strtok (char *__restrict __s, const char *__restrict __delim)
      |              ^~~~~~

Solution

  • As @WhozCaig said change:

    char *line[MAX_ITEM_DESCRIPTION_STRING + MAX_ITEM_NAME_STRING + 10];
    

    to:

    char line[MAX_ITEM_DESCRIPTION_STRING + MAX_ITEM_NAME_STRING + 10];
    

    What is the 10? Define another constant for that.

    ch is not used. Remove it.

    fgets() returns NULL on error or EOF. Use that instead of if(feof() {...}. You don't want to execute those strcpy() when fgets() fails.