• C

Reading text file items to an array

Hi,
I'm trying to read some strings in from a text file, and I'm having so many problems with it. Urgh it's annoying when it takes days to do something that should be simple. All I really want to be able to do, is read in all items and put it in an array. item1 in array[0], item2 in array[1] etc.

The program is ran by calling the program and specifying the text file. So you run this:   test items.txt

I have a textfile called 'items.txt', inside is:
item1
item2
item3
item4

I've now got:
---

int main(int argc, char **argv)
{
   FILE *ifp;
   char items[20];
   int i = 0;

   ifp = fopen(argv[1], "r");

   if (ifp != 0) {
      while (!feof(ifp)) {

???
 
        }
      }
   }

}



Can anyone please help me.
cc2006Asked:
Who is Participating?
 
Infinity08Connect With a Mentor Commented:
>>    char items[20];
This is only 1 string - you want an array of strings :

    char items [10][20];

Note that this array can hold 10 strings of maximum 19 characters each !! Don't try to store longer strings in it or more than 10 strings !! Make sure you check this !!

>> ???
Check out fgets() :

http://www.cplusplus.com/ref/cstdio/fgets.html
0
 
cc2006Author Commented:
Oh right, I thought   char items [10][20];   was only used on 2d arrays.

Thanks, I'll play around with that.
0
 
Infinity08Commented:
>> Oh right, I thought   char items [10][20];   was only used on 2d arrays.
This is a 2D array of characters !

Remember, a string is an array of characters. And you want an array of strings. So, you get an array of an array of characters, or a 2D array of characters.

>> Thanks, I'll play around with that.
Feel free to post code or ask additional questions !
0
KuppingerCole Reviews AlgoSec in Executive Report

Leading analyst firm, KuppingerCole reviews AlgoSec's Security Policy Management Solution, and the security challenges faced by companies today in their Executive View report.

 
John KawakamiConnect With a Mentor Commented:
Ay ay ay... My C is rusty, but this seemed pretty easy, so here goes:

#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main(int argc, char **argv)
{
      FILE *ifp;
      char *items[20];
      char line[1024];
      int i=0;
      int j=0;

      ifp = fopen(argv[1],"r");
      if (ifp==0)  { exit(1); }
      while( fgets(line, 1023, ifp) )
      {
            items[i] = malloc(strlen(line));
            strcpy( items[i], line );
            i++;
      }
      for(j=0; j<i; j++)
      {
            printf("%s", items[j]);
      }
}



Maximum line length is 1023 chars (at which point, things mess up).
0
 
Infinity08Commented:
>>           items[i] = malloc(strlen(line));
>>           strcpy( items[i], line );

Make this :

          items[i] = malloc(strlen(line) + 1);
          strcpy( items[i], line );

Or even better, use strncpy() instead of strcpy().
0
 
cc2006Author Commented:
Thanks guys I'll have a look at that.

What's the main difference between strncpy() instead of strcpy() then?
0
 
Infinity08Commented:
>> What's the main difference between strncpy() instead of strcpy() then?
strncpy() is safer because it allows you to specify a length, which, if done correctly, avoids overflows.

http://www.cplusplus.com/ref/cstring/strcpy.html
http://www.cplusplus.com/ref/cstring/strncpy.html
0
 
John KawakamiCommented:
Thanks infinity!  (it's all coming back to me as if in a dream)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.