Joseph Martin wrote: > I am a subscribee to the linux-c-programming listserv. I have > tried to send the message there several times during the last few days > with no luck. It's not getting bounced, but I'm not recieving it back in > my mailbox either. Could you please post it for me? (Any maybe answer too? > :) Done. > I am struggling with my long time nemesis again - strings in C. I > have a function I'm writing that will read in a file, assign each line to > a subscript in an array, and return the array. Problem is I can't get pass > the returning. Suggestions welcome. Code follows. Thanks a ton. > > #include <stdio.h> > #include <stdlib.h> > #include "file.h" > > char *read_file() > { > char line[10][80]; > int i; > FILE *budget; > > if((budget = fopen("/home/martinja/.bashrc", "r"))==NULL) { > printf("Cannot open config file\n"); > exit(1); > } > for(i=0; i<10; i++) { > fgets(line[i], 80, budget); > printf("%s", line[i]); // This tests if line reads > // correctly > } > fclose(budget); > return ??? //help here please! > } You will need to dynamically allocate the memory to store the data. The variable `line' will vanish once you return from the function. Also, you probably want to return a `char **' rather than `char *'. The attached program reads each line into a temporary buffer, and then copies the string to dynamically allocated memory using strdup(). The array of pointers to each line is also dynamically allocated; the array is resized as necessary using realloc(). -- Glynn Clements <[EMAIL PROTECTED]>
#include <stdlib.h> #include <stdio.h> #include <string.h> char **read_file(const char *filename) { char buff[1024]; char **index; int size, count; FILE *fp; fp = fopen(filename, "r"); if (!fp) { fprintf(stderr, "Cannot open config file\n"); exit(1); } size = 16; index = malloc(size * sizeof(char *)); for (count = 0; ; count++) { if (!fgets(buff, sizeof(buff), fp)) break; if (count >= size - 1) { size *= 2; index = realloc(index, size * sizeof(char *)); } index[count] = strdup(buff); } index[count] = NULL; fclose(fp); return index; } int main(void) { char **index; int i; index = read_file("/etc/passwd"); for (i = 0; index[i]; i++) fputs(index[i], stdout); return 0; }