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

标签 c file

我是 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/

相关文章:

在 Eclipse 的用户空间编译文件系统

c - 奇怪的#define 声明,无法理解它扩展的内容

c - srand()——为什么只调用一次?

C:将DNA序列压缩成二进制

c - sprintf() 的使用以及 gdb 报告程序提前脱离循环?

c - 如何检查初始化的结构是否为空?

python - 使用 pandas read_csv 检测导入 csv 文件的 header 分隔符

linux - 在 Unix/Linux 中将特定文件从一个文件夹复制到另一个文件夹

c 程序将媒体文件从一个位置复制到另一个位置

c - 即使文件不存在,fopen也会返回非空指针