C-是否有一种方法可以读取文件流,直到找到一个(.).然后重复



我是C的新手,不确定我该怎么做。我发现了类似的问题,但没有我想要的。

我想做的是读取一个原始的txt文件"句子",句子的结尾被视为(。(或newline( n(。任何数据结构都没有假定的最大长度。

我的第一个想法是getline(),但是我需要使用的C版本似乎没有这样的功能。因此,我尝试使用fgets(),然后将数据解析到带有SCANSET的sscanf()上。sscanf(charLine, "%[^.]s", sentence);

问题的问题是,如果有一个以上的时期(。(将停止在第一个时期,而在此期间不再开始(。(收集其他时期。

我觉得自己在正确的轨道上,但不是如何对此进行扩展。

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

您可以编写一个读取流的函数,直到找到.或newline。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] = '';
    return dest;
}

如果要处理任意的长句子,则将指针带到destsize,并在需要时重新分配数组。

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

也请注意,即使在上述限制下,必须在.上停止,即必须遵循空白,仍然会导致假阳性:句子可以包含嵌入式期间,然后是句子不是句子末端的空白。示例:感谢David C. Rankin对我的答案的评论。

最新更新