Take the 2-minute tour ×

I'm writing a program that passes data from a file into an array, but I'm having trouble with fopen (). It seems to work fine when I hardcode the file path into the parameters (eg fopen ("data/1.dat", "r");) but when I pass it as a pointer, it returns NULL.

Note that line 142 will print "data/1.dat" if entered from command line so parse_args () appears to be working.

132 int
133 main(int argc, char **argv)
134 {
135   FILE *in_file;
136   int *nextItem = (int *) malloc (sizeof (int));
137   set_t *dictionary;
139   /* Parse Arguments */
140   clo_t *iopts = parse_args(argc, argv);
142   printf ("INPUT FILE: %s.\n", iopts->input_file); /* This prints correct path */
143   /* Initialise dictionary */
144     dictionary = set_create (SET_INITAL_SIZE);
146   /* Use fscanf to read all data values into new set_t */
147   if ((in_file = fopen (iopts->input_file, "r")) == NULL)
148   {
149     printf ("File not found...\n");
150     return 0;
151   }

Thanks! Rhys

MORE: If I try to print the string after I run set_create() (ln 144), the string doesn't print. (But there isn't any reference to the string in the function at all...)

 47 set_t *
 48 set_create(int size)
 49 {
 50   set_t *set;
 52   /* set set_t members */
 53   set->items = 0;
 54   set->n_max = size;
 55   set->lock = FALSE;
 57   /* allocate memory for dictionary input */
 58   set->data = (int *) malloc (size * sizeof (int));
 60   return set;
 61 }

It does work if I call this function after fopen (). I can't see how this is affecting the filename though...

Thanks again.

share|improve this question
Have you checked that line 144 isn't clobbering the name somehow? –  dmckee Mar 19 '10 at 2:55
Embedded spaces, nulls, newlines or whatever at the end of input_file that would appear to print correctly but would make fopen barf? –  Duck Mar 19 '10 at 2:58
To address Duck's concern I always enclose a test print like that in '. Like printf("Filename '%s'\n",p->name);. –  dmckee Mar 19 '10 at 3:02
Try printing the path again after the fopen fails.. that would rule out clobbering (See sth's answer). Also try moving the set_create function call after the fopen (Though if this works, it is not a solution). –  Splat Mar 19 '10 at 3:09
From the information we have available, it looks like this code should work properly. What are we missing? Try distilling out everything else that is not relevant and you'll find the culprit. –  Variable Length Coder Mar 19 '10 at 3:12
show 2 more comments

3 Answers

up vote 4 down vote accepted

Your new code shows that you are writing to invalid memory. set is a pointer but you never initialize it. You're overwriting some random memory and thereby destroying the pointer to the string that you're passing to fopen().

share|improve this answer
Thanks a bunch. –  Rhys Mar 19 '10 at 3:28
add comment

Are you sure parse_args works correctly? If it, for example, returns a pointer to a local variable (or a struct that contains such pointers), the values like iopts->input_file would easily be destroyed by subsequent function calls.

share|improve this answer
That's a better though on how line 144 could cause trouble than I had. –  dmckee Mar 19 '10 at 3:07
add comment

That second part is your problem. set is not initialized.

To clarify: you're modifying stuff that you don't mean to, causing the fopen() to fail.

share|improve this answer
Thanks, the program works now. –  Rhys Mar 19 '10 at 3:29
No problem. That's why we're here. ;-) –  Richard Pennington Mar 19 '10 at 3:31
add comment

Your Answer


