我正在尝试编写一个函数,给定文件名,它将从文件中读取字符串到字符串数组。函数将返回该数组(列表)。
我尝试过列表为char *类型,以及[50] [100]的数组,其中50是列表中单词的最大数量,而100是单词的最大长度。我还尝试过使用strcpy将单词复制到数组中的索引,以及将列表中的索引设置为word(list [i] = word)。
char list[100][100];
char word[100];
int i = 0;
FILE * fp = fopen(filename, "r+");
while (!feof(fp)) {
fscanf(fp, "%s", word);
strcpy(list[i], word);
i++;
}
当我运行调用此函数(而没有其他函数)的代码时,出现分段错误11。
编辑:我将代码更改为如下运行:
char arr[100][100];
int i = 0;
FILE * fp = fopen("collection.txt", "r+");
while (fscanf(fp, "%s", arr[i]) == 1 && i < 100) {
i++;
}
当我在主函数中对其进行测试时,它可以工作,但是当将其作为函数调用时,我无法使其工作。我将函数定义为:
char get_list (char * filename);
并使用
从主函数中调用此函数char list = get_list ("testfile.txt");
编译器发出警告:
warning: incompatible pointer to integer conversion returning 'char [100][100]' from a function with result type 'char' [-Wint-conversion]
该函数应如何定义和调用?
答案 0 :(得分:0)
尝试将阵列(列表)的名称更改为其他名称。告诉我们会发生什么
注意:在while循环&& i < 100
这对我有用
char arr[100][100];
char word[100];
int i = 0;
FILE * fp = fopen(filename, "r+");
while (!feof(fp) && i < 100)
fscanf(fp, "%s", arr[i++]);
答案 1 :(得分:0)
错误是您的数组定义的“列表”超出范围。因为文本文件可能包含Char(在此代码中为单词)大于100 。尝试添加其他条件来避免这种情况,就像
#include <stdio.h>
#include <stdlib.h>
int main()
{
char list[100][100];
char word[100];
int i = 0;
char filename[]="mytxt.txt";
FILE * fp = fopen(filename, "r+");
while (!feof(fp) && i<100 )
{
fscanf(fp, "%s", word);
strcpy(list[i], word);
i++;
}
printf(list[2]);
return 0;
}
或者您可以修改该代码以获取文本文件的char长度并将其循环。
答案 2 :(得分:0)
您将要查看Why is while ( !feof (file) ) always wrong?
每当您在循环中读取数据时,都可以使用读取功能来控制循环,例如
#define ROWS 100 /* if you need a constant, #define one (or more) */
#define COLS ROWS
...
/* you control the read loop with the read function itself
* you must protect your ROW bounds with the counter and
* protect your COL bounds with the field-width modifier.
*/
while (i < ROWS && fscanf (fp, "%99s", list[i]) == 1)
i++; /* increment counter */
以上,通过仅在计数器小于可用行数的情况下添加一个新单词来保护ROWS
(行)数组。通过将 field-width 修饰符用于COLS
转换说明符,以确保不超过"%s"
个字符,可以保护99
绑定被读入您的数组(为+1保留空间- nul-terminate 字符)。
(注意:您的words
数组是多余的。您可以直接读入list
)
现在您已从列表中存储的文件中读取了所有单词。不管每行有一个还是多个单词,一次读取一个单词,"%s"
转换说明符都会忽略前导空格(包括'\n'
)。
一个简短的示例可以是:从作为程序第一个参数提供的文件中读取单词(如果没有给出参数,则默认情况下从stdin
读取):
#include <stdio.h>
#define ROWS 100 /* if you need a constant, #define one (or more) */
#define COLS ROWS
int main (int argc, char **argv) {
char list[ROWS][COLS]; /* 2D array to hold strings (words) */
int i = 0; /* counter for strings */
/* use filename provided as 1st argument (stdin by default) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
/* you control the read loop with the read function itself
* you must protect your ROW bounds with the counter and
* protect your COL bounds with the field-width modifier.
*/
while (i < ROWS && fscanf (fp, "%99s", list[i]) == 1)
i++; /* increment counter */
for (int j = 0; j < i; j++) /* output stored words */
printf ("list[%2d] : %s\n", j, list[j]);
if (fp != stdin) /* close file if not stdin */
fclose (fp);
}
示例输入文件
以行中包含多个单词而其他行中包含单个单词的方式获取文件:
$ cat dat/dictwrds20.txt
a
AAA
AAAS
aardvark Aarhus Aaron ABA
Ababa
aback
abacus abalone abandon abase
abash
abate abbas abbe
abbey
abbot
Abbott
使用/输出示例
上面的代码将每个单词读入list
数组中,没有任何问题:
$ ./bin/readlist dat/dictwrds20.txt
list[ 0] : a
list[ 1] : AAA
list[ 2] : AAAS
list[ 3] : aardvark
list[ 4] : Aarhus
list[ 5] : Aaron
list[ 6] : ABA
list[ 7] : Ababa
list[ 8] : aback
list[ 9] : abacus
list[10] : abalone
list[11] : abandon
list[12] : abase
list[13] : abash
list[14] : abate
list[15] : abbas
list[16] : abbe
list[17] : abbey
list[18] : abbot
list[19] : Abbott
仔细研究一下,如果您有任何疑问,请告诉我。