[問題] 奇怪的中文讀檔問題..

看板C_and_CPP (C/C++)作者時間12年前 (2013/11/26 17:25), 編輯推噓5(5013)
留言18則, 8人參與, 最新討論串1/1
各位前輩好 小弟有一個C的讀檔問題想請教 我有一個test.txt檔 裡面假設有打一個名字 (例如:王小明) 我的目的是想在陣列中存下這三個中文字 以方便後續計算 但是 卻一直跑步出中文字 希望各位前輩能給予小弟一點建議或是有沒有更好的作法呢?謝謝~ 程式碼如下: #include <stdio.h> int main(int argc, char* argv[]){ char WordFrequency[6]; //設 char Word[2]; //chinese word is 2 bytes int i; FILE *in = fopen("test.txt", "r"); FILE *out = fopen("output.txt", "w"); while( fgets( Word, sizeof(Word), in ) ){ for( i = 0; i <= 5; i = i + 2 ){ WordFrequency[i] = Word[0]; WordFrequency[i+1] = Word[1]; } } fputs(Wordfrequency,out); fclose(in); fclose(out); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.71.70.253

11/26 17:53, , 1F
你知道wordfreqece =word的意思嗎?
11/26 17:53, 1F

11/26 17:55, , 2F
不是因為中文字佔2b 所以有分前半和後半部分?
11/26 17:55, 2F

11/26 18:22, , 3F
好奇怪啊 為什麼中文字是2byte呢
11/26 18:22, 3F

11/26 18:25, , 4F
我知道6為啥不可..是下面的for迴圈的終止條件設錯@@
11/26 18:25, 4F

11/26 18:26, , 5F
但是用fprintf針對每個元素印出來還是怪怪的..
11/26 18:26, 5F
※ 編輯: snoopy0907 來自: 219.71.70.253 (11/26 18:44)

11/26 20:23, , 6F
你知道字串的結尾是什麼嗎
11/26 20:23, 6F

11/26 21:15, , 7F
你知道你的while跟for共跑幾次嗎?...還要補'\0'
11/26 21:15, 7F

11/26 21:51, , 8F

11/26 21:52, , 9F
問題在於 fgets 發現你給的空間只有 2 bytes
11/26 21:52, 9F

11/26 21:52, , 10F
而最後一個 byte 比須做為 null terminator
11/26 21:52, 10F

11/26 21:53, , 11F
所以它會只讀 1 byte 並在後面補 '\0'
11/26 21:53, 11F

11/26 23:21, , 12F
程式做的不是題目要的
11/26 23:21, 12F

11/27 08:08, , 13F
謝謝,後來自己try過幾次就知道一個字要3個byte
11/27 08:08, 13F

11/27 09:51, , 14F
3 個 byte...竟然是 UTF-8 orz
11/27 09:51, 14F

11/27 16:23, , 15F
snoopy0907: 你的假設不會每次都正確,utf8 是不定長度編碼
11/27 16:23, 15F

11/27 16:24, , 16F
中文有可能 3-4 byte, 這不是容易處理的問題, 請找尋
11/27 16:24, 16F

11/27 16:24, , 17F
library 來處理這問題。
11/27 16:24, 17F

11/27 16:25, , 18F
若你可以使用 c++11, 可以使用 ofstream/wifstream 來處理
11/27 16:25, 18F
文章代碼(AID): #1Ib6a6Jm (C_and_CPP)
文章代碼(AID): #1Ib6a6Jm (C_and_CPP)