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

时间:2016-04-15 23:36:49

标签: c file linked-list eof fgetc

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

当我用

阅读文件时
void initStudent(Student* ptr, int markNum, int studentNum)
{
    for (int i = 0; i < studentNum; i++)
    {

       cout << "Enter Student " << i+1 << " Name :";
       cin >> ptr[i].name;
       cout << "Enter Student ID Number :";
       cin >> ptr[i].id;
       ptr[i].mark = new int[markNum]
       for (int j = 0; j < markNum; j++)
        {
            cout << "Please enter a mark :";
            cin >> ptr[i].mark[j];
        }
     }
  }

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

我是C的初学者。谢谢你。

1 个答案:

答案 0 :(得分:1)

你的问题是你只能在EOF上拨打addSentence(),所以在你读完整个文件之前,它并没有神奇地看到任何东西。据推测,你需要在检测到句子结束时调用它(通过'.''?''!'的测试 - 你还需要null终止字符串在调用addSentence并使用新分配和正确大小重置内存之前以及在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 64。这将导致分配更少的未使用内存。