I have used a section of code found on here to read in a .txt
file line by line, and I think this should add all of the lines into an array named words
. Whenever I try and return a value from the array, for example printf(words[7]);
all of the lines from the text document are returned, not just the 7th value in the array. Have all of the lines not been split into an array properly, or are all of the values of the array being returned?
void readFile() {
FILE* fp; // Declare the file pointer
int lines_allocated = 128;
int max_line_len = 100;
/* Allocate lines of text */
char** words = (char**)malloc(sizeof(char*) * lines_allocated);
if (words == NULL) {
fprintf(stderr, "Out of memory (1).\n");
exit(1);
}
switch (difficulty) // Open the file for read
{
case 'e':
fp = fopen("words_easy.txt", "r");
break;
case 'm':
fp = fopen("words_medium.txt", "r");
break;
case 'h':
fp = fopen("words_hard.txt", "r");
break;
default:
printf("Cannot open file");
}
if (fp == NULL) {
fprintf(stderr, "Error opening file.\n");
exit(2);
}
int i;
for (i = 0; 1; i++) {
int j;
/* Have we gone over our line allocation? */
if (i >= lines_allocated) {
int new_size;
/* Double our allocation and re-allocate */
new_size = lines_allocated * 2;
words = (char**)realloc(words, sizeof(char*) * new_size);
if (words == NULL) {
fprintf(stderr, "Out of memory.\n");
exit(3);
}
lines_allocated = new_size;
}
/* Allocate space for the next line */
words[i] = malloc(max_line_len);
if (words[i] == NULL) {
fprintf(stderr, "Out of memory (3).\n");
exit(4);
}
if (fgets(words[i], max_line_len - 1, fp) == NULL)
break;
/* Get rid of CR or LF at end of line */
for (j = strlen(words[i]) - 1;
j >= 0 && (words[i][j] == '\n' || words[i][j] == '\r'); j--)
;
words[i][j + 1] = '\0';
}
/* Close file */
fclose(fp);
int j;
for (j = 0; j < i; j++)
printf("%s\n", words[j]);
/* Good practice to free memory */
for (; i >= 0; i--)
free(words[i]);
free(words);
printf(words[7]);
return 0;
}
The document is one word per line, and I am only trying to print one word as a test, however I am getting all of the lines outputted to the console when I try and call one value from the array.