如何从文本文件中读取单词并将其添加到字符串数组中? [英] How to read words from a text file and add to an array of strings?
问题描述
这是我的函数,其调用方式为: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屋!