我正在尝试打开一个文件,并从中读取..但我遇到了一些问题.
FILE *libFile = fopen("/Users/pineapple/Desktop/finalproj/test242.txt","r");
char wah[200];
fgets(wah, 200, libFile);
printf("%s test\n", wah);
Run Code Online (Sandbox Code Playgroud)
这打印:\ 377\376N测试而不是我的文件的任何内容.
任何想法为什么?
完整代码:
#import <Cocoa/Cocoa.h>
#import <stdio.h>
int main(int argc, char *argv[])
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
FILE *libFile = fopen("/Users/pineapple/Desktop/finalproj/test242.txt","r");
if(libFile){
char wah[200];
fgets(wah, 200, libFile);
printf("%s test\n", wah);
}
[pool drain];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
test242.txt不包含超过200个字符.
Dav*_*ong 13
如果这是针对Objective-C的,为什么不这样做:
使用NSFileHandle:
NSString * path = @"/Users/pineapple/Desktop/finalproj/test242.txt";
NSFileHandle * fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
NSData * buffer = nil;
while ((buffer = [fileHandle readDataOfLength:1024])) {
//do something with the buffer
}
Run Code Online (Sandbox Code Playgroud)
或使用NSString:
NSString * fileContents = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
Run Code Online (Sandbox Code Playgroud)
或者如果你需要逐行阅读:
IMO,没有必要下载到C级文件IO函数,除非你有一个非常非常好的理由这样做(即,使用O_SHLOCK或打开一个文件)
您的文件以UTF-16(Unicode)存储.文件中的第一个字符是"L",即代码点0x4C.文件的前4个字节FF FE 4C 00是字节顺序标记(BOM),字母L以UTF-16编码为两个字节.
fgets不支持Unicode,所以它正在寻找换行符'\n',即字节0x0A.很可能这会发生在Unicode换行符的第一个字节(两个字节0A 00)上,但它也可能发生在很多其他非换行符上,例如U + 010A(拉丁文大写字母A上面有点)或者其他任何字符. Gurmukhi或古吉拉特语脚本(U + 0A00到U + 0AFF).
但是,在任何情况下,最终在缓冲区中的数据wah都有很多嵌入的空值,看起来像FF FE 4C 00 47 00 4F 00 4F 00 0A 00.NUL(0x00)是C字符串终止符,因此当您尝试使用时将其打印出来printf,它会在第一个空值处停止,您所看到的就是\377\376L. \377\376是字节的八进制表示FF FE.
解决此问题的方法是将文本文件转换为单字节编码,例如ISO 8859-1或UTF-8.请注意,必须使用单字节编码(UTF-8除外)不能编码所有Unicode字符,因此如果您需要Unicode,我强烈建议您使用UTF-8.或者,您可以将程序转换为支持Unicode的程序,但是您不能再使用许多标准库函数(例如fgets和printf),并且您需要在wchar_t任何地方使用它来代替char.
| 归档时间: |
|
| 查看次数: |
22362 次 |
| 最近记录: |