有没有一种方法可以读取文件流,直到找到句点(。)。然后重复吗?

时间:2019-05-08 07:27:19

标签: 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...
    }

1 个答案:

答案 0 :(得分:3)

您可以编写一个函数来读取流,直到找到.或换行符为止。戴维·C·兰金(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对我的回答的评论。