You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下Eclipse运行C程序打开.txt/.bin文件无输出求助

问题分析与解决

首先,你遇到的控制台无输出(或输出全0)的问题不是Linux权限或配置问题——如果是权限不足,fopen会返回NULL,你的代码会直接返回-1,连后面的printf都不会执行。真正的问题出在代码逻辑里,我帮你拆解一下:

核心错误:循环条件搞混了赋值与比较

看你interpukcijski函数里的while循环:

while((c==fgetc(f))!=EOF){

这里你误用了==(比较运算符),正确的写法应该是用=(赋值运算符)先把文件读取的字符赋值给c,再判断是否到文件末尾:

while((c = fgetc(f)) != EOF){

原来的写法会先把c(初始是随机值)和fgetc(f)的返回值比较,得到0或1的布尔结果,再拿这个结果和EOF(通常是-1)对比,逻辑完全混乱,导致循环根本不会正确遍历文件内容,三个计数器自然都是0。如果刚好你的终端因为没有换行符没刷新输出,就会看起来像是“控制台为空”。

次要问题:printf缺少换行符

Linux终端的标准输出是行缓冲的,如果printf末尾没有\n,输出内容可能会被暂存而不立即显示在屏幕上。建议修改为:

printf("%d %d %d\n", d.tocka, d.upitnik, d.usklicnik);

修改后的完整代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct znakovi{
 int tocka;
 int upitnik;
 int usklicnik;
};
struct znakovi interpukcijski(FILE *f){
 int brojac_tocki=0,brojac_upitnika=0,brojac_usklicnika=0;
 char c;
 // 修正循环条件的赋值逻辑
 while((c = fgetc(f)) != EOF){
     if(c=='.') brojac_tocki++;
     if(c=='?') brojac_upitnika++;
     if(c=='!') brojac_usklicnika++;
 }
 struct znakovi z;
 z.tocka=brojac_tocki;
 z.upitnik=brojac_upitnika;
 z.usklicnik=brojac_usklicnika;
 return z;
}
int main(){
 struct znakovi d;
 FILE *f;
 f=fopen("/home/matej/pmalabos/vjezba1/zd.txt","r");
 if(f==NULL) {
     // 加上错误提示,方便排查文件问题
     perror("Failed to open file");
     return -1;
 }
 d=interpukcijski(f);
 // 添加换行符确保输出立即显示
 printf("%d %d %d\n",d.tocka,d.upitnik,d.usklicnik);
 fclose(f);
 return 0;
}

额外小建议

  • 用ls /home/matej/pmalabos/vjezba1/zd.txt在终端里确认文件是否真的存在,路径有没有写错;
  • 保留perror的提示,以后遇到文件打开失败,能直接看到具体原因(比如文件不存在、权限不够等),比单纯返回-1更实用。

内容的提问来源于stack exchange,提问作者broskyy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:42:06