打开文件并从文件Objective-c中读取

6 objective-c fgets

我正在尝试打开一个文件,并从中读取..但我遇到了一些问题.

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)

或者如果你需要逐行阅读:

如何逐行读取NSFileHandle的数据?

IMO,没有必要下载到C级文件IO函数,除非你有一个非常非常好的理由这样做(即,使用O_SHLOCK或打开一个文件)

  • 这是对的.如果文件不一定包含字符串数据(即原始字节),请使用NSData对象及其dataWithContentsOfFile构造函数,您不必担心NSString对字符串编码的自动解释. (2认同)

Ada*_*eld 6

您的文件以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的程序,但是您不能再使用许多标准库函数(例如fgetsprintf),并且您需要在wchar_t任何地方使用它来代替char.