Foundation框架中的NSFileHandle二

Foundation框架中的NSFileHandle二

 

看官们,我们在前面章回中介绍了Foundation框架中的NSFileHandle,本章回中将继续介绍该内容。


我们在上一章回中主要介绍了NSFileHandle类中文件操作相关的方法,在实际项目中需要综合使用这些方法才能完成文件操作,文件操作的主要步骤可以分为三大步:打开、读写、关闭,我自己称其为文件操作三步曲。这么说可能比较抽象,接下来我们通过代码来演示这三个步骤,下面是具体的代码,请大家参考:


#include<Foundation/Foundation.h>

int main()
{
	NSFileHandle *fhIn, *fhOut;
	NSFileManager *fm;
	char data[5] = "hello";
	NSData *buffer = [[NSData alloc] initWithBytes:data length:5];
	NSString * inPath = @"/Users/talk8/in";
	NSString * outPath = @"/Users/talk8/out";
	NSError *error;
	int result = 0;
	unsigned long long offset = 0;

	fm = [NSFileManager defaultManager];

	//判断文件是否存在,只有文件存在时才能进行读写操作
	if(![fm fileExistsAtPath:inPath]) {
		[fm createFileAtPath:inPath contents:buffer attributes:nil];
	}

	fhIn = [NSFileHandle fileHandleForReadingAtPath:inPath];
	if(fhIn == nil) {
		NSLog(@" open: %@ failed.",inPath);
		result = 1;
	}

	//判断文件是否存在,只有文件存在时才能进行读写操作
	if(![fm fileExistsAtPath:outPath]) {
		[fm createFileAtPath:outPath contents:nil attributes:nil];
	}

	fhOut = [NSFileHandle fileHandleForWritingAtPath:outPath];
	if(fhOut == nil) {
		NSLog(@" open: %@ failed.",outPath);
		result = 1;
	}

	//从文件中读取内容并且通过Log显示出来
	NSString *str;
	// NSData *tempData = [fhIn readDataOfLength:5];
	NSData *tempData = [fhIn readDataUpToLength:5 error:&error];
	if(error == nil) {
		str = [[NSString alloc] initWithData:tempData encoding:NSUTF8StringEncoding];
		NSLog(@" contents of File: %@",str);
	} else {
		NSLog(@" can't get contents of file");
	}

	//循环读取文件中的内容走到文件末尾
	// while([tempData length] > 0 && error == nil) {
	// 	tempData = [fhIn readDataUpToLength:5 error:&error];
	// }

	//读取文件内容后,文件指针的位置发生了变化,通过log输出可以看到
	[fhIn getOffset:&offset error:nil];
	NSLog(@" offset: %llu",offset);
	//重置文件指针到文件初始位置,不然下次无法从文件开头读取文件内容
	[fhIn seekToOffset:0 error:nil];

	//从一个文件中读取内容然后保存到另外一个文件中
	[fhOut writeData: [fhIn readDataOfLength:5]];

	//文件读写完成后需要关闭文件
	if(fhIn != nil) {
		// [fhIn closeFile];
		result = [fhIn closeAndReturnError:&error];
		fhIn = nil;
	}

	if(fhOut != nil) {
		// [fhOut closeFile];
		result = [fhOut closeAndReturnError:&error];
		fhOut = nil;
	}

	return 0;
}


在代码中我们添加了相关的注释,以方便大家理解代码。不过我们还要强调一些文件操作的注意事项:

  • 1.打开文件时需要判断文件是否存在,以避免不必要的麻烦;
  • 2.打开文件后需要判断文件是否被成功打开,然后再进行读写操作;
  • 3.读写操作需要注意文件指针的位置,必要通过定位方法修改文件指针位置;
  • 4.读写操作可以单次执行,也可以通过循环多次执行,到达文件尾部时读取内容为0进而结束循环;


最后我们对本章回的内容做一个总结:

  • 1.文件操作主要包含三大步骤:打开、读写、关闭;
  • 2.文件操作有四个注意点,请参考上面的总结的内容;


看官们,本章回的内容就介绍到这里,欲知后事如何且听下回分解!

上一篇:git_learn


下一篇:Scikit-learn_模型评估与参数调优_交叉验证