gpt4 book ai didi

c - 有没有办法读取文件流,直到找到句点 (.)。然后重复?

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:37 24 4
gpt4 key购买 nike

我是 C 语言的新手,不确定我该怎么做。我发现了类似的问题,但没有完全符合我的要求。

我想做的是“逐句”读取原始 txt 文件,句子结尾被视为句点 (.) 或换行符 (\n)。没有任何数据结构的假定最大长度。

我首先想到的是getline(),但是要求我使用的C版本好像没有这样的功能。所以我尝试使用 fgets() 然后将数据解析到带有扫描集的 sscanf() 上。 sscanf(charLine, "%[^.]s", sentence);

问题在于,如果有多个句点 (.),它会在第一个句点停止,而不会在该句点 (.) 处再次开始以收集其他句点。

我觉得我走在正确的轨道上,但不知道如何扩展它。

    while(fgets (charLine, size, readFile) == NULL)
{
sscanf(charLine, "%[^.]s", sentence);
// something here...
}

最佳答案

您可以编写一个函数来读取流,直到找到 . 或换行符。 David C.Rankin 建议仅扫描 . 可能过于严格,导致 www.google.com 中嵌入的句点充当断句。可以在 . 处停止,如果后跟空格:

#include <ctype.h>
#include <stdio.h>

/* alternative to fgets to stop at `.` and newline */
char *fgetsentence(char *dest, size_t size, FILE *fp) {
size_t i = 0;
while (i + 2 < size) {
int c = getc(fp);
if (c == EOF)
break;
dest[i++] = (char)c;
if (c == '\n')
break;
if (c == '.') {
int d = getc(fp);
if (d == EOF)
break;
if (isspace(d)) {
dest[i++] = (char)d;
break;
}
ungetc(d, fp);
}
}
if (i == 0)
return NULL;
dest[i] = '\0';
return dest;
}

如果你想处理任意长句子,你可以使用指向 destsize 的指针,并在需要时重新分配数组。

请注意,使用 fscanf(fp, "%[^.\n]", dest) 是非常不切实际的,因为无法将最大字节数传递到其中dest 作为评估的参数,需要对空行和句子进行特殊处理。

另请注意,在 . 处停止,即使有上述限制,即它后面必须跟有空格,仍然会导致误报:句子可以包含嵌入的句点,后面跟着不是结束的空格这句话。示例:感谢 David C. Rankin 对我的回答的评论。

关于c - 有没有办法读取文件流,直到找到句点 (.)。然后重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56035603/

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