Here is my function which is called with:getWord(words);
void getWord(char words[][MAXWORDLENGTH]){
int i;
char newWord[MAXWORDLENGTH];
FILE* fi
Alright, you may be making things more difficult than they need to be. The comment wasn't meant to pick on you, but whatever compiler/IDE you are using should have been spitting out ERRORS right and left. The fact that it compiled at all is surprising. The advise in the comment was sound. Always, always compile with warnings enabled and fix all warnings before you consider your code trustworthy.
That being said, you have a couple of areas where you are making things hard on yourself. You should pass the array, and a FILE*
pointer (or filename) rather than hardcoding a filename in a function. That makes the function of very limited use. Your use of fgets
, as you now know, was not correct. Further, after you pass your array, you need only read each word (assuming 1-per line) into the array while making sure your don't exceed the number of rows you have declared.
Here is a short example that will read from the filename given on the command line (or from stdin
by default). It makes use of a ternary
operator to either accept a filename as the first argument or set fp
to stdin
. Give it a try and let me know if you have questions:
#include <stdio.h>
#define MAXW 64 /* maximum number of lines to read */
#define MAXC 32 /* longest word in abridged Dict. is 28 char
"Antidisestablishmentarianism" */
size_t getwords (char (*words)[MAXC], FILE *fp);
int main (int argc, char **argv) {
char words [MAXW][MAXC] = {{0}}; /* array to hold words */
size_t nwords = 0; /* number of words read */
size_t i;
/* open argv[1] for reading (default: stdin) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
nwords = getwords (words, fp);
if (fp != stdin) fclose (fp); /* close file */
printf ("\n words read from '%s':\n\n",
argc > 1 ? argv[1] : "stdin");
for (i = 0; i < nwords; i++)
printf (" words[%2zu] : %s", i, words[i]);
return 0;
}
/* function to read words, 1 - per line, from 'fp' */
size_t getwords (char (*words)[MAXC], FILE *fp)
{
size_t idx = 0; /* index of words read */
/* read each line in file into words array
note: includes trailing newline character */
while (idx < MAXW && fgets (words[idx], MAXC, fp)) {
idx++;
/* note you should check if chars remain in line */
}
if (idx == MAXW) /* check word count against MAXW */
fprintf (stderr, "warning: MAXW words read.\n");
return idx;
}
Compile
gcc -Wall -Wextra -O3 -o bin/fgets_array_words_fn fgets_array_words_fn.c
Input File
$ cat dat/captnjack1.txt
This
is
a
tale
Of
Captain
Jack
Sparrow
A
Pirate
So
Brave
On
the
Seven
Seas.
Output
$ ./bin/fgets_array_words_fn dat/captnjack1.txt
words read from 'dat/captnjack1.txt':
words[ 0] : This
words[ 1] : is
words[ 2] : a
words[ 3] : tale
words[ 4] : Of
words[ 5] : Captain
words[ 6] : Jack
words[ 7] : Sparrow
words[ 8] : A
words[ 9] : Pirate
words[10] : So
words[11] : Brave
words[12] : On
words[13] : the
words[14] : Seven
words[15] : Seas.
or reading from stdin
:
$ ./bin/fgets_array_words_fn <dat/captnjack1.txt
words read from 'stdin':
words[ 0] : This
words[ 1] : is
...
Use fread() method
while(fread(newWord, MAXWORDLENGTH,1,file)){
printf("newWord: %s", newWord);
strcpy(words[i], newWord);
}