如何从文本文件中读取单词并将其添加到字符串数组中? [英] How to read words from a text file and add to an array of strings?

查看:266
本文介绍了如何从文本文件中读取单词并将其添加到字符串数组中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的函数,其调用方式为:getWord(words);

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

void getWord(char words[][MAXWORDLENGTH]){
int i;
char newWord[MAXWORDLENGTH];
FILE* file;
file = fopen("wordbank.txt","r");
if(file==NULL){
    printf("Error\n");
}else{
    printf("File read\n");
    for(i=0;i<=MAXWORDS;i++){
        fgets(newWord, "%s", file);
        printf("newWord: %s", newWord);
        strcpy(words[i], newWord);
    }

}
fclose(file);

}

不幸的是,我的数组单词"没有用字符串填充每个元素,它可以将文本文件中的第一个单词捕获到[0]元素中,然后其余单词变得乱七八糟.

Unfortunately my array "words" does not fill each element with a string, it is able to capture the first word in my text file into the [0] element and then the rest is gibberish.

我的文本文件如下:

apple
winter
summer
skunk
clouds
pencil
grape

使用指针代替数组会更容易吗?

Would it be easier for me to use a pointer instead of an array?

感谢您的帮助!

推荐答案

好的,您可能使事情变得比原本需要的困难.该评论并不是要接受您的意见,但是您使用的任何编译器/IDE都应该左右散布错误.它完全编译的事实令人惊讶.评论中的建议是正确的.始终始终编译启用警告并修正所有警告,然后再认为您的代码值得信赖.

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.

话虽这么说,但您有两个方面使自己感到困难.您应该传递数组和FILE*指针(或文件名),而不是对函数中的文件名进行硬编码.这使得该功能的使用非常有限.如您所知,您对fgets的使用是不正确的.此外,在传递数组之后,只需确保将每个单词(假设每行1个)读入数组,同时确保您的单词不超过声明的行数即可.

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.

这是一个简短的示例,将从命令行给定的文件名(或默认情况下从stdin)读取.它使用ternary运算符来接受文件名作为第一个参数,或者将fp设置为stdin.试试看,如果您有任何疑问,请告诉我:

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;
}

编译

gcc -Wall -Wextra -O3 -o bin/fgets_array_words_fn fgets_array_words_fn.c

输入文件

$ cat dat/captnjack1.txt
This
is
a
tale
Of
Captain
Jack
Sparrow
A
Pirate
So
Brave
On
the
Seven
Seas.

输出

$ ./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.

或从stdin中读取:

$ ./bin/fgets_array_words_fn <dat/captnjack1.txt

 words read from 'stdin':

  words[ 0] : This
  words[ 1] : is
  ...

这篇关于如何从文本文件中读取单词并将其添加到字符串数组中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆