【问题标题】:C: Handling fgetc input from file streamsC:处理来自文件流的 fgetc 输入
【发布时间】:2012-06-18 01:41:03
【问题描述】:

好的,我正在使用 C 语言编写一个拼写检查程序。我遇到的问题是将系统词典中的一个单词读入程序。我已经搜索了一个答案,但我找不到任何完全正确的东西,可能是因为这是一个非常基本的东西。这是我目前得到的代码。

void readWord(FILE * stream, int buffer[]){
15   
16   while(fgetc(stream) != 10){
17     buffer[i] = fgetc(stream);              
18     printf("copying %d to buffer\n", buffer[i]);    //added for debugging
19   }
20   return;
21 }

这里是函数调用中使用的变量以及调用

int buffer[WIZE];
readWord(dictionary, buffer, WSIZE);

dictionary 指向 /usr/share/dict/words,并且有代码可以确保它正确打开,但我没有把它放在这个问题中;也许这毕竟是问题所在。这应该输出 Aarhus,但它输出的是:

Dictionary opened successfully
copying 97 to buffer
copying 104 to buffer
copying 115 to buffer

我想知道是否每次程序执行第 16 行时文件位置都会更新到下一个字符?如果指针从第二个字符开始,则输出是每隔一个 Aarhus 字母。

readWord 函数也用于从文本文件中读取单个单词进行检查,这就是我没有使用 getline 的原因。还有其他函数可以将缓冲区连同终端空字符一起刷新为字符串并显示。这只是处理一次从文件中获取一个单词的问题。

【问题讨论】:

  • 当你执行 while 语句时你正在读取一个字符,当你分配给 buffer[i] 时你正在读取另一个字符。您也没有在任何地方增加 i...

标签: c fgetc


【解决方案1】:
while(fgetc(stream) != 10){

在 while 条件下,您正在读取未保存到任何位置的字符。然后,您在正文中读取另一个字符,因此每次迭代读取 2 个字符并仅保存一个。

此外,您将字符存储在缓冲区 [i] 中,但 i 没有增加。试试这个:

while((buffer[i] = fgetc(stream)) != 10){
     printf("copying %c to buffer\n", buffer[i]);    //added for debugging
     i++;
 }

【讨论】:

    【解决方案2】:

    您应该使用 getline 从文件流中读取输入。

    【讨论】:

      【解决方案3】:

      97a 的字符代码,104h 的字符代码等等。尝试使用%c 将它们打印为字符。

      我想知道是否每次程序执行第 16 行时文件位置都会更新到下一个字符?

      在您的readWord 中,每次复制字符时,您都需要更新缓冲区的索引 (i)。一旦你打了一个换行符,你还需要空终止buffer10 不可移植;检查换行时使用\n

      【讨论】:

        【解决方案4】:

        多亏了答案,它才能工作;这是解决方法

        void readWord(FILE * stream, int buffer[]){
            unsigned short int i = 0;
            while((buffer[i] = fgetc(stream)) != '\n'){
                    printf("copying %d to buffer\n", buffer[i]);
                    i++;
            }
            return;
        }
        

        -和输出

        Dictionary opened successfully
        copying 65 to buffer
        copying 97 to buffer
        ...
        Dictionary word is Aarhus
        

        【讨论】:

          猜你喜欢
          • 2014-01-07
          • 2019-09-12
          • 2013-02-05
          • 2021-02-07
          • 1970-01-01
          • 1970-01-01
          • 2012-09-28
          • 1970-01-01
          • 2014-02-23
          相关资源
          最近更新 更多