C语言或OC或C++ 中英文混合的文件读取前3个字符怎么做?


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

c objective-c C++

纯纯的小铁牛 11 years, 4 months ago

这个得看编码。如果编码标准不确定,恐怕什么软件都会读出乱码来。

战场原荡然 answered 11 years, 4 months ago

...不确定和你说的是不是一个东西...
无非是中文字符的问题,你直接取前6个字符的长度(不管中英文,6个字符总够了),转换成NSString,再直接substringToIndex:3一下,取前三个字,不就出来了吗?

loli狂 answered 11 years, 4 months ago

问题的重点在于: ANSI 编码的条件下,一个汉字占两个字节,一个英文字符占一个字节

那么对于你说的例子:


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

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


 c


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


如果全是中文,例如:


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

那么你如果想要汉字不被截断,至少应该读取 偶数个字节


 c


 fread(x,sizeof(char),6,fp);
printf("%s\n", x); // 输出 "你好啊"

wagtail answered 11 years, 4 months ago

提供个思路:

  1. 读取文件,你必须知道字符编码
  2. 生成NSString 对象,NSString 有个初始化方法是 initWithData:encoding: ,然后 NSData 有个初始化方法是 dataWithContentsOfFile:
  3. 确保步轴2 正常生成对象后,调用 NSString 的成员方法: substringWithRange: 进行截取

希望能帮到lz

hwybr answered 11 years, 4 months ago

Your Answer