How to read words from a text file and add to an array of strings?

前端 未结 2 2036
太阳男子
太阳男子 2021-01-16 07:17

Here is my function which is called with:getWord(words);

void getWord(char words[][MAXWORDLENGTH]){
int i;
char newWord[MAXWORDLENGTH];
FILE* fi         


        
相关标签:
2条回答
  • 2021-01-16 07:41

    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
      ...
    
    0 讨论(0)
  • 2021-01-16 07:43

    Use fread() method

    while(fread(newWord, MAXWORDLENGTH,1,file)){
        printf("newWord: %s", newWord);
        strcpy(words[i], newWord);
    }
    
    0 讨论(0)
提交回复
热议问题