背景:
最近遇到个问题,在获取航拍实时数据做图像处理的时候,有时候处理结果不正确(图像中有目标物,没有识别出来)。就需要在画面上添加一个按钮,点击来保存当时的画面到沙盒中。
但是,写入的数据,需要放到Matlab下生成图片。所以,使用OC自带的writeToFile不方便实用。(将Array writeToFile 到 txt后,里面的格式是XML。。。)
1、首先获取当前时间,用作文件名来区分保存的文件。
```
NSString*timeStr = [NSStringstringWithFormat:@"%@",[NSDatedate]];
```
2、获取文件路径
```
// 获取沙盒documents路径
NSMutableString *documentsPath = [NSMutableString stringWithString:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]];
// 拼接成对应的文件路径名
[documentsPath appendFormat:@"/rData_%@.txt",timeStr];
```
3、NSString转成C的指针string
const char *filePath = [documentsPath UTF8String];
4、打开文件(若不存在则创建文件)
// "w" 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
// "w+" 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
// "a" 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
// "a+" 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
FILE *fp = fopen(filePath, "w+");
5、写入
// _RArray数据是 NSNumber numberWithInt: 写入,对应用intValue取出来
int a =[_RArray[j][k] intValue];
fprintf(fp, "%d\t", a);
6、关闭文件
fclose(fp);
由于有RGB三个通道,循环三次依次写入三个文件。完整代码如下
NSString *timeStr = [NSString stringWithFormat:@"%@",[NSDate date]];
for (NSInteger i = 1; i <= 3; i++)
{
// 获取路径
NSMutableString *documentsPath = [NSMutableString stringWithString:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]];
switch (i) {
case 1:
[documentsPath appendFormat:@"/rData_%@.txt",timeStr];
break;
case 2:
[documentsPath appendFormat:@"/gData_%@.txt",timeStr];
break;
case 3:
[documentsPath appendFormat:@"/bData_%@.txt",timeStr];
break;
default:
break;
}
const char *filePath = [documentsPath UTF8String];
NSLog(@"documentsPath : %@",documentsPath);
FILE *fp = fopen(filePath, "w+");
switch (i)
{
case 1:
for (NSInteger j = 0; j < _RArray.count; j++) {
for (NSInteger k = 0; k < [_RArray[0] count]; k++) {
int a =[_RArray[j][k] intValue];
// printf("%d\t",a);
fprintf(fp, "%d\t", a);
}
fprintf(fp, "\n");
}
break;
case 2:
for (NSInteger j = 0; j < _GArray.count; j++) {
for (NSInteger k = 0; k < [_GArray[0] count]; k++) {
int a =[_GArray[j][k] intValue];
fprintf(fp, "%d\t", a);}
fprintf(fp, "\n");
}
break;
case 3:
for (NSInteger j = 0; j < _BArray.count; j++) {
for (NSInteger k = 0; k < [_BArray[0] count]; k++) {
int a =[_BArray[j][k] intValue];
fprintf(fp, "%d\t", a);}
fprintf(fp, "\n");
}
break;
default:
break;
}
fclose(fp);