2011-06-03 41 views
0

char buf [32];如何将C文件操作更改为Objective C?

FILE * fp = fopen(“test.txt”,“r”);

fscanf(fp,“%s”,buf);

fclose(fp);

我想C以上的文件操作更改为Objectiv C.

如何改变?

Objcectiv C中没有fscanf类的东西吗?

+0

对于什么是值得的,你可以保留这段代码,如果你想。 Objective-C是C的超集,所有POSIX文件都可用。尽管如此,请参阅@ Micah的等效答案。 – 2011-06-03 20:43:48

+0

我知道Objective-C是C的超集,但我必须将buf更改为NSString来执行某些操作。我必须在每个fscanf之后使用[NSString stringWithCString ...]吗? – user698200 2011-06-03 20:54:56

回答

1

你不知道。您无法直接从FILE *扫描到NSString。但是,一旦你读入缓冲区,你可以从它创建一个NSString

NSString *str = [NSString stringWithCString: buf encoding: NSASCIIStringEncoding]; // or whatever 

注意,但是,使用fscanf因为你在这里会导致缓冲区溢出。您必须为结尾的空字符指定缓冲区的大小,减一:

fscanf(fp, "%31s", buf); 
+0

Objective C中没有fscanf这样的东西吗? – user698200 2011-06-03 20:48:03

+0

我必须在每个fscanf之后使用[NSString stringWithCString ...]吗?其实fopen和fclose之间有很多fscanfs。 – user698200 2011-06-03 21:03:31

+0

'NSScanner'可让您从一个字符串扫描到另一个字符串; 'NSInputStream'让你读取一个文件。但是,在Objective-C级别上运行的'fscanf()'没有确切的等效,否。 – 2011-06-03 21:03:56

2

最好的办法是使用NSData的在你的文件中读取,然后创建一个字符串。

NSData *dataContents = [NSData dataWithContentsOfFile: @"test.txt"]; 
NSString *stringContents = [[NSString alloc] initWithData: dataContents 
             encoding: NSUTF8StringEncoding]; 

假设您的文件是UTF8。

没有意义搞乱缓冲区。让框架完成肮脏的工作。

编辑:在回答你的评论,如果你真的,真的需要一行一行地读它,看看Objective-C: Reading a file line by line

+0

我想在执行某些操作的同时逐行读取文件。读完文件后我不想那么做。我怎样才能做到这一点? – user698200 2011-06-03 20:46:31

+0

请参阅我编辑中的链接。 – 2011-06-03 20:52:43

1

你只是想读取文本文件转换成字符串?

NSError *error = nil; 
NSString *fileContents = [NSString stringWithContentsOfFile:@"test.txt" withEncoding:NSUTF8StringEncoding error:&error]; 

if(!fileContents) { 
    NSLog(@"Couldn't read file because of error: %@", [error localizedFailureReason]); 
} 

当然,这里假定使用UTF8编码。

+0

我简化了我的代码太多。 fopen和fclose之间有很多东西。我读完一行后,必须将buf更改为NSString。我读完整个文件后不想这样做。 – user698200 2011-06-04 14:28:45