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
相关产品推荐
相关产品推荐

