我对C还是很陌生,不知道该怎么做。我发现了类似的问题,但没有我想要的。
我想做的是读取一个原始的txt文件“逐句”,其中句子的结尾被认为是句点(。)或换行符(\ n)。没有假定任何数据结构的最大长度。
我的第一个想法是getline()
,但是我需要使用的C版本似乎没有这样的功能。因此,我尝试使用fgets()
,然后使用扫描集将数据解析到sscanf()
上。 sscanf(charLine, "%[^.]s", sentence);
与此相关的问题是,如果存在多个句点(。),它将在第一个句点(。)停止,而不会在那个句点(。)再次开始,以收集其他句点。
我觉得自己处在正确的轨道上,但是不知道如何扩展。
while(fgets (charLine, size, readFile) == NULL)
{
sscanf(charLine, "%[^.]s", sentence);
// something here...
}
答案 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;
}
如果要处理任意长句子,则可以使用指向dest
和size
的指针,并在需要时重新分配数组。
请注意,使用fscanf(fp, "%[^.\n]", dest)
是非常不切实际的,因为不可能将要存储的最大字节数作为求值参数传递到dest
中,并且需要特殊情况下使用空行和句子。
也请注意,即使有以上限制(必须在其后跟空白),也要停在.
上,否则仍会导致误报:句子可以包含嵌入句点,后跟空格(不是句子的结尾)。示例:感谢David C. Rankin对我的回答的评论。