objective-c - C语言或OC或C++ 中英文混合的文件读取前3个字符怎么做?
黄舟
黄舟 2017-04-17 11:42:25
0
4
552

1.txt 文件内容: 你好a,我是千叶!
期望结果: 你好a

C#include <stdio.h>                                                                                                                                                                                                                          
main()                                                                                                                                                                                                                                      
{                                                                                                                                                                                                                                           
FILE *fp;                                                                                                                                                                                                                                   
fp=fopen("1.txt","r");                                                                                                                                                                                                                      
char x[1000];                                                                                                                                                                                                                               
fread(x,sizeof(char),7,fp);   //length=7,对于现在的1.txt结果正确,如果1.txt变成纯中文的文件,第三个汉字就会被截断,请问要怎么处理呢?                                                                                                                                                                                                             
printf("%s",x);                                                                                                                                                                                                                             
}                 

====================================================================================

我的场景是文件比较大,不太想把整个文件读取到NSData或者NSString,所以希望NSData读取部分数据,再转化成NSString,于是就遇到了中文字符截取出现问题的情况。看了大家的回答,发现这个问题可能是个伪命题,毕竟文件的偏移是按字节算的不会去考虑文件字符编码。

之前提了一个问题在Object-c节点,没有人回答 所以想看看用C能不能解决,原问题:http://segmentfault.com/q/1010000002530834?_ea=128095

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(4)
Peter_Zhu

提供個思路:

  1. 讀取文件,你必須知道字元編碼
  2. 產生NSString 對象,NSString 有個初始化方法是initWithData:encoding:,然後 NSData 有個初始化方法是dataWithContentsOfFile:
  3. 確保步軸2 正常產生物件後,呼叫 NSString 的成員方法:substringWithRange:進行截取

希望能幫到lz

左手右手慢动作

問題的重點在於:ANSI 編碼的條件下,一個漢字佔兩個位元組,一個英文字元佔一個位元組

那麼對於你說的例子:

// 1.txt
你好a,我是千叶!
^^^^^
// "你好a", 数一数,是5个字节。

所以如果你想截取"你好a", 那麼使用:

cfread(x,sizeof(char),5,fp);
printf("%s\n", x); // 输出 "你好a"

如果全是中文,例如:

// 1.txt
你好啊,我是千叶!
^^^^^^
// 三个汉字是 6 个字节

那你如果想要漢字不被截斷,至少應該讀取偶數個位元組

cfread(x,sizeof(char),6,fp);
printf("%s\n", x); // 输出 "你好啊"
伊谢尔伦

這個得看編碼。如果編碼標準不確定,恐怕什麼軟體都會讀出亂碼來。

Ty80

...不確定跟你說的是不是一個東西...
無非是中文字元的問題,你直接取前6個字元的長度(不管中英文,6個字元總夠了),轉換成NSString,再直接substringToIndex:3一下,取前三個字,不就出來了嗎?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板