[問題] C語言 輸出字元至螢幕變成笑臉圖案...

看板C_and_CPP (C/C++)作者 (秘密)時間15年前 (2010/08/17 14:09), 編輯推噓1(1021)
留言22則, 6人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 練習一個簡單的讀入檔案程式,使用環境是 Visual studio 2008 ****************code****************** //此程式為開啟一個在c:\\prog\welcome.txt檔案,讀入字元並計算字元數 #include<stdio.h> #include<stdlib.h> int main() { FILE *f; int count = 0; char ch; f = fopen("c:\\prog\\welcome.txt","r"); if(f != NULL) { while(ch = getc(f) != EOF) { printf("%c",ch); count++; } printf("\n總共有%d個字元\n",count); fclose(f); } else printf("檔案開啟失敗"); system("pause"); return 0; } 希望得到的正確結果: 檔案內容為 hello kitty 應得到螢幕印出 hello kitty 總共有11個字元 程式跑出來的錯誤結果: :) ← 就是那種word會出現的圓形的小笑臉 11個 ...... 總共有11個字元 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) VC++ 有問題的code: (請善用置底文標色功能) 編譯都過,除了有警告fopen要改成fopen_s以外 不過改了以後反而就編譯不過了(?) 補充說明: none 感謝好心人解答~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.75.177

08/17 14:15, , 1F
while那一行的括號內 邏輯判斷有問題
08/17 14:15, 1F

08/17 14:15, , 2F
(ch==getc(f)) &&(getc(f)!=EOF) 試試看
08/17 14:15, 2F

08/17 14:17, , 3F
while ((ch = getc(f)) != EOF)
08/17 14:17, 3F

08/17 14:18, , 4F
原本的寫法會解譯成(ch = (getc(f) != EOF))出來都 0x01
08/17 14:18, 4F

08/17 14:19, , 5F
二樓的寫法讀出來會少字
08/17 14:19, 5F

08/17 14:20, , 6F
對,上面會少字,不過可以成功的讓笑臉變回英文字元 hlokt
08/17 14:20, 6F

08/17 14:21, , 7F
可能是因為ch變數沒有初始值,不能邏輯判斷 == getc(f)
08/17 14:21, 7F

08/17 14:22, , 8F
D大的結果則是與我一開始的code一樣
08/17 14:22, 8F

08/17 14:23, , 9F
你說三樓的code跟你一開始的結果一樣? @_@
08/17 14:23, 9F

08/17 14:23, , 10F
對啊,還是11個笑臉 笑得我心底發寒 orz
08/17 14:23, 10F

08/17 14:27, , 11F
可以貼一下你改完之後的code嗎 0.0
08/17 14:27, 11F
就是直接改成您的建議,只有加一對括號,應該不需要貼code。 = 是雙元運算子,就是左右都要有運算元,功能是把 右邊的運算元 存進 左邊, 我自己的猜想,應該加不加括號都對這個錯誤沒有什麼差別... 不過我是新手剛學,真的是不了解,如果上述猜想有錯也請各位大德指正觀念, 感謝! ※ 編輯: shesee 來自: 140.116.75.177 (08/17 14:34)

08/17 14:41, , 12F
3樓是對的阿, 怎麼會跑不出來 = =
08/17 14:41, 12F

08/17 14:42, , 13F
你沒把改過的貼上來, 別人也不知道你有沒有改錯
08/17 14:42, 13F

08/17 14:47, , 14F
加不加括號當然有差,差在「右邊的operand」是取什麼東西
08/17 14:47, 14F

08/17 14:47, , 15F
BTW, 如果你照三樓的方式改還不能跑的話,我也束手無策 :(
08/17 14:47, 15F
#include<stdio.h> #include<stdlib.h> int main() { FILE *f; int count = 0; char ch; f = fopen("c:\\prog\\welcome.txt","r"); if(f != NULL) { while((ch=getc(f))!=EOF) { printf("%c",ch); count++; } printf("\n總共有%d個字元\n",count); fclose(f); } else printf("檔案開啟失敗!"); system("pause"); return 0; } ※ 編輯: shesee 來自: 140.116.75.177 (08/17 14:56) ※ 編輯: shesee 來自: 140.116.75.177 (08/17 14:58)

08/17 15:08, , 16F
@_____@ 只好徵求其它強者來把脈了
08/17 15:08, 16F

08/17 15:10, , 17F
感謝樓上熱情解答XD
08/17 15:10, 17F

08/17 15:17, , 18F
while( fscanf( f, "%c",&ch) != EOF ) 呢?
08/17 15:17, 18F

08/17 17:58, , 19F
用fgetc會如何?
08/17 17:58, 19F

08/17 23:09, , 20F
同樣的code與測資, 我拿VC2005跑了是OK的說@_@"
08/17 23:09, 20F

08/17 23:09, , 21F
說的是後面修改過的新版:)
08/17 23:09, 21F

08/18 11:42, , 22F
OK了,換一個VC就OK...XD
08/18 11:42, 22F
文章代碼(AID): #1CQYU0ih (C_and_CPP)
文章代碼(AID): #1CQYU0ih (C_and_CPP)