【问题标题】:How do I get fputc function to work on windows 11? [closed]如何让 fputc 函数在 Windows 11 上运行? [关闭]
【发布时间】:2023-01-18 23:53:30
【问题描述】:

我正在尝试一个非常简单的程序,其中 test.txt 中编写的任何内容都会被复制到 up.txt 中,但要用大写字母。我在 Windows 11 上使用 dev c++,运行程序后创建了 up.txt 文件,但它是空的,我不知道为什么。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(){
    FILE *fpin, *fpout; 
    char x;
    fpin=fopen("test.txt","r");
    if(fpin==NULL){
        fprintf(stderr,"read error\n");
        exit(666);
    }
    fpout=fopen("up.txt","w");
    if(fpout=NULL){
        fprintf(stderr,"write error/n");
        exit(667);
    }
    while((x=fgetc(fpin))!=EOF){
        fputc(toupper(x),fpout);
    }
    fclose(fpin);
    fclose(fpout);
    
    return 0;
}

我在 linux 上成功地尝试了相同的程序,但我不确定为什么它在 windows 上不起作用

【问题讨论】:

  • 您的代码有误:将if (fpout = NULL) 更改为if (fpout == NULL)。我看不出您的代码如何在任何平台上运行。
  • 使用int x而不是char,因为EOF超出了256个有效char值的范围
  • @Bodo 这不是主要问题。
  • 您可以将那些 fprintf(stderr,"some error")perror("some error") 交换,这将在以后的程序中打印 "some error: &lt;error message&gt;" —— 这样您就知道了什么地方出了错.
  • @sartttt 至于你的问题,它可能会因为“由错字引起”而被关闭。不要让你气馁:你的问题是有效的,实际上非常好就第一个 SO 问题而言。你包括了一个minimal reproducible example,大多数初学者都没有,并描述了问题。接近的投票基本上只是技术性的(答案对你有帮助,但不太可能对未来的读者有帮助,所以不会列出)。 +1给你。

标签: c dev-c++


【解决方案1】:

此代码无法在任何平台上运行。您确定您在 Linux 上运行的代码实际上与您在问题中显示的代码完全相同吗?

主要问题在这里:

   fpout=fopen("up.txt","w");
                         // up.txt is now created

   if (fpout = NULL) {   // you're using an assignment here (=) instead 
                         // of the == operator
      fprintf(stderr,"write error/n");
      exit(667);
   }
   // fpout is NULL now

if (fpout = NULL) 不是比较,它只是将NULL 分配给fout。由于结果是false(这或多或少与 NULL 相同),fprintf(stderr,"write error/n");exit(667) 将不会被执行,程序只会继续。

然后在随后的 while 循环中,您正在写入一个 NULL FILE 指针,这是未定义的行为,程序很可能会崩溃,或者它可能什么都不做或只是退出,或者可能是其他原因)。在您最喜欢的搜索引擎上查找“C 未定义行为”。


还有另一个微妙的错误:char x; 应该是 int x; 因为 fgetc 返回 int,而不是 char

阅读以下文章了解更多信息:

【讨论】:

  • 只是想知道:为什么它可以在 Linux 上运行?因为它与您发布的代码不完全相同?
  • 还有第二个更微妙的错误:(x=fgetc(fpin))!=EOF因为xchar,它永远不可能等于EOF。为了完整起见,请随意将其添加到您的答案中。
  • @Lundin 正确,其中一个 cmet 中已经提到了这一点。但是,是的,我会把它添加到问题中,thnks。
  • @Lundin 完成了
【解决方案2】:

谢谢大家这只是一个愚蠢的错字

【讨论】:

  • 不要将答案滥用为 cmets。如果您想发表评论,请写评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2018-03-05
  • 1970-01-01
相关资源
最近更新 更多