gpt4 book ai didi

c - 使用fgetc读取文件并将句子添加到链表中

转载 作者:行者123 更新时间:2023-11-30 20:23:15 25 4
gpt4 key购买 nike

最近三天我遇到了一个问题..我有一个包含句子的文件。

当我读取文件时

int maxSize = 256;
int currSize = 0;
int i = 0;
char *sentence = (char*)malloc(maxSize);
char c;

currSize = maxSize;

while ((c = fgetc(input)) != EOF)
{
sentence[i++] = c;

while((c = fgetc(input)) != '\n')
{
sentence[i++] = c;

if((c == '.') || (c == '?') || (c == '!'))
sentence[i++] = '\n';

if(i == currSize)
{
currSize = i + maxSize;
sentence = (char*)realloc(sentence,currSize);
}
}
}

sentence[i] = '\0';

addSentence(sentence);

当函数 addSentence 将句子添加到链接列表中时,会出现问题,因为它只添加由文件中所有内容组成的一个句子...

我是 C 初学者。谢谢。

最佳答案

您的问题是您仅在 EOF 处调用 addSentence() ,因此在您读取整个文件之前它不会神奇地看到任何内容。据推测,当您检测到句子结尾时需要调用它(测试 '.''?''!' — 在调用 addSentence 之前,您还需要以 null 终止字符串,并使用新的分配和正确的大小重置内存)以及 EOF 处。目前尚不清楚为什么有两个循环;你可能会错过一些换行符作为句子的结尾。只需一个循环即可返工。

尚不完全清楚换行符是否标记句子的结尾。此修订假设它们:

int maxSize = 256;
int currSize = maxSize;
int i = 0;
int c;
char *sentence = (char*)malloc(maxSize);
assert(sentence != 0); // Not a production-ready error check

while ((c = fgetc(input)) != EOF)
{
sentence[i++] = c;

if ((c == '\n') || (c == '.') || (c == '?') || (c == '!'))
{
if (c != '\n')
sentence[i++] = '\n';
sentence[i] = '\0';
addSentence(sentence);
sentence = malloc(maxSize);
assert(sentence != 0); // Not a production-ready error check
currSize = maxSize;
i = 0;
}

if (i == currSize)
{
currSize = i + maxSize;
sentence = (char*)realloc(sentence, currSize);
assert(sentence != 0); // Not a production-ready error check
}
}

sentence[i] = '\0';
addSentence(sentence);

请注意,对失败内存分配的错误检查不是生产质量;应该有一些适当的、无条件的错误检查。如果句末标点符号恰好落在错误的位置,则存在缓冲区溢出的小风险。生产代码也应该避免这种情况,但会更麻烦。我将使用字符串数据类型和函数来进行添加。我可能还会猜测大多数句子都短于 256 个字符(特别是如果换行符标记结尾),并且会使用 maxSize of 64。这将导致分配更少的未使用内存。

关于c - 使用fgetc读取文件并将句子添加到链表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36658441/

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