gpt4 book ai didi

c - 如何在文件中逐字扫描?

转载 作者:行者123 更新时间:2023-11-30 18:33:24 25 4
gpt4 key购买 nike

我有一个文件,其中包含一系列由空格分隔的单词。例如 file.txt 包含以下内容:“这是文件”。如何使用 fscanf 逐字读取并将每个单词放入字符串数组中?

然后我这样做了,但我不知道它是否正确:

char *words[100];
int i=0;
while(!feof(file)){
fscanf(file, "%s", words[i]);
i++;
fscanf(file, " ");
}

最佳答案

读取重复输入时,您可以使用输入函数本身(在您的情况下是fscanf)来控制输入循环。虽然您也可以连续循环(例如 for (;;) { ... })并独立检查返回是否为 EOF匹配失败 发生,或者返回是否与转换说明符的数量匹配(成功),在您的情况下,只需检查返回是否与单个 "%s" 转换说明符匹配即可(例如,返回是1)。

将每个单词存储在数组中,您有多种选择。最简单的是使用具有自动存储功能的二维 char 数组。由于 Unabridged Dictionary 中最长的非医学单词有 29 个字符(加上 nul-termination 字符总共需要 30 个字符),因此需要一个固定行数和固定数量的二维数组至少 30 列就可以了。 (动态分配允许您根据需要读取和分配内存,以容纳尽可能多的单词——但这要留到以后再说。)

因此,要设置 128 个单词的存储空间,您可以执行类似于以下操作的操作:

#include <stdio.h>

#define MAXW 32 /* if you need a constant, #define one (or more) */
#define MAXA 128

int main (int argc, char **argv) {

char array[MAXA][MAXW] = {{""}}; /* array to store up to 128 words */
size_t n = 0; /* word index */

现在只需打开作为程序第一个参数提供的文件名(如果没有给出参数,则默认从 stdin 读取),然后验证 您的文件已打开供阅读,例如

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

现在到了读循环的关键。只需循环检查 fscanf返回即可确定读取成功/失败,向数组添加单词并在每次成功读取时递增索引。您还必须在循环控制中包含对索引与数组边界的检查,以确保您不会尝试向数组写入超出数组所能容纳的字数,例如

    while (n < MAXA && fscanf (fp, "%s", array[n]) == 1)
n++;

就是这样,现在只需关闭文件并根据需要使用存储在数组中的单词即可。例如,只打印存储的单词,您可以这样做:

    if (fp != stdin) fclose (fp);   /* close file if not stdin */

for (size_t i = 0; i < n; i++)
printf ("array[%3zu] : %s\n", i, array[i]);

return 0;
}

现在只需编译它,启用警告(例如 gcc/clang 的 -Wall -Wextra -pedantic ,或 ( VS,cl.exe),然后在您的文件上进行测试。完整的代码是:

#include <stdio.h>

#define MAXW 32 /* if you need a constant, #define one (or more) */
#define MAXA 128

int main (int argc, char **argv) {

char array[MAXA][MAXW] = {{""}}; /* array to store up to 128 words */
size_t n = 0; /* word index */
/* 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;
}

while (n < MAXA && fscanf (fp, "%s", array[n]) == 1)
n++;

if (fp != stdin) fclose (fp); /* close file if not stdin */

for (size_t i = 0; i < n; i++)
printf ("array[%3zu] : %s\n", i, array[i]);

return 0;
}

输入文件示例

$ cat dat/thefile.txt
this is the file

示例使用/输出

$ ./bin/fscanfsimple dat/thefile.txt
array[ 0] : this
array[ 1] : is
array[ 2] : the
array[ 3] : file

仔细检查一下,如果您还有其他问题,请告诉我。

关于c - 如何在文件中逐字扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57698054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com