一、日志重定向

我们在iOS开发过程中,我们时常会使用NSLog打印到控制台的日志信息进行代码调试,但这样调试的前提是连接上Xcode。
如果进行真机调试但同时又不能连接Xcode的时候,就不能直接在xcode的控制台查看输出日志了,但是程序还是会执行那些Log的,如果要查看这些日志,我们就需要把输出日志信息保存到文件中,然后进行查看。

标准NSLog的打印默认是往标准错误(stderr)进行打印的,我们只需要修改NSLog的打印输出路径即可实现日志重定向

以下是日志重定向代码:
  1. #pragma mark - 用户方法,将NSLog的输出信息写入到文件中
  2. /* 将NSlog打印信息保存到Document目录下的文件中 */
  3. - (void)redirectLogToDocumentFolder
  4. {
  5. // 获取沙盒路径
  6. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
  7. NSString *documentDirectory = [paths objectAtIndex:0];
  8. // 获取打印输出文件路径
  9. NSString *fileName = [NSString stringWithFormat:@"myData.log"];
  10. NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:fileName];
  11. // 先删除已经存在的文件
  12. NSFileManager *defaultManager = [NSFileManager defaultManager];
  13. [defaultManager removeItemAtPath:logFilePath error:nil];
  14. // 将NSLog的输出重定向到文件,因为C语言的printf打印是往stdout打印的,这里也把它重定向到文件
  15. freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout);
  16. freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);
  17. }

AppDelegateapplication:didFinishLaunchingWithOptions:中调用:

  1. - (BOOL)application:(UIApplication *)application
  2. didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  3. {
  4. // 重定向Log日志信息到Document文件中
  5. [self redirectLogToDocumentFolder];
  6. return YES;
  7. }

到这里还没结束,因为你的Log日志信息已经打印到了真机应用的沙盒文件中,你还需要把它拷贝到你的Mac上进行查看,你就需要设置共享文件配置 :

在应用程序的Info.plist文件中添加UIFileSharingEnabled键,并将键值设置为YES

一旦iOS设备插入到用户计算机,iTunes就会在选中设备的Apps标签中显示一个文件分享区域。设置了文件共享后,用户就可以向该目录添加文件或者将文件移动到桌面计算机中。就是说,设置了文件共享后,一旦设备连接上电脑,可以通过iTune查看指定应用程序的共享文件夹,将文件拷贝到你的电脑上看。

二、文件流知识补充

1. 打开文件

FILE *fp = fopen(文件路径,打开方式);

打开方式:
  • r : 读,如果文件不存在返回NULL,存在就打开
  • w : 写,如果文件存在则覆盖,不存在则创建
  • a : 追加,如果文件存在则追加,不存在则创建
  • r+ : 在r的基础上,多增加了写的权限
  • w+ : 在w的基础上,多增加了读的权限
  • a+ : 在a的基础上,多增加了读的权限
  • t : 文本文件(默认的),结合有rt、wt、at、rt+
  • b : 二进制文件,结合有rb、wb、ab、rb+
2. 文件操作
  1. char ch = fgetc(文件指针);
    作用:从文件中读取一个字符
    【fgetc和getc没有区别,用法也一样】
  2. fputc(字符,文件指针);
    作用:写入一个字符到文件
  3. fgets(字符数组,长度n,文件指针);
    作用:从文件指针指向的文件中读取n-1个字符存到字符数组里,会自动在后面加\0,字符数组用来保存你读取出来的字符串
    【遇到“\n”立即结束读取】
  4. fputs(字符串,文件指针);
    作用:写入一个字符串到文件指针指向的文件
  5. fread(保存数据的首地址,每块的大小,多少块,文件指针);
    作用:从文件指针指向的文件中分块读取(文件指针),告诉它一次读取多少块(多少块),每块多大(第二个参数),存到哪(第一个参数)
    【它只关心具体读的字节数,不会关心这些自己里面有没有换行 】
  6. fwrite(数据的首地址,每块的大小,多少块,文件指针);
    作用:将数据分块写入到文件指针指向的文件。第一个是告诉系统,写入什么数据,第二个是告诉系统每块多少字节,第三个是告诉系统分多少块写入,第四个是写入到哪个文件
  7. fscanf(文件指针,格式化控制符,地址列表);
    作用:格式化读取
  8. fprintf(文件指针,格式化控制符,参数列表);
    作用:格式化写入
  9. freopen(文件路径path, 打开方式mode, 文件指针fp);
    作用:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件具体是指stdinstdoutstderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。
3. 关闭文件

fclose(文件指针);

iOS学习笔记40-日志重定向的更多相关文章

  1. iOS学习笔记-自己动手写RESideMenu

    代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...

  2. iOS学习笔记20-地图(二)MapKit框架

    一.地图开发介绍 从iOS6.0开始地图数据不再由谷歌驱动,而是改用自家地图,当然在国内它的数据是由高德地图提供的. 在iOS中进行地图开发主要有三种方式: 利用MapKit框架进行地图开发,利用这种 ...

  3. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  4. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  5. IOS学习笔记之关键词@dynamic

    IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...

  6. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  7. iOS学习笔记10-UIView动画

    上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...

  8. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  9. iOS学习笔记之Category

    iOS学习笔记之Category 写在前面 Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法.使用类别可以对框架提供的类(无法获取源码,不能直接修改) ...

随机推荐

  1. python——动态类型

    1.变量,对象,引用 变量是一个系统表的元素,拥有指向对象的连接的空间: 对象是分配的一块内存: 引用是自动形成的从变量到对象的指针: 类型属于对象,而不是变量 a=3;  变量a变成对象3的一个引用 ...

  2. poj 3159 Candies (差分约束)

    一个叫差分约束系统的东西.如果每个点定义一个顶标x(v),x(t)-x(s)将对应着s-t的最短路径. 比如说w+a≤b,那么可以画一条a到b的有向边,权值为w,同样地给出b+w2≤c,a+w3≤c. ...

  3. [dp][uestc]L - 菲波拉契数制升级版

    数据很大,以背包的思路数组开不下. 先定序地考虑一个菲波拉契数如fib(i)的表示法,假设i比较大,由菲波拉契数的定义可知道fib(i)=fib(i-1)+fib(i-2);要找到其它表示就继续拆分f ...

  4. UVA 1442 Cave 洞穴 (贪心+扫描)

    题意:有一个洞穴,每个位置有一个底的高度p[i],和对应顶的高度s[i],要往里面尽量放燃料,要求燃料不能碰到顶,可以无限接近. 题解:制约燃料储放的就是顶的高度了,分别求出设当前储放位置的向两边的延 ...

  5. ecplise——python not configured报错

    解决方法:点击window——preferences——PyDey——pythonInterprter 最后成功

  6. 2004: C语言实验——数日子(数组)

    2004: C语言实验——数日子 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 213  Solved: 111[Submit][Status][Web ...

  7. 【转】Java8学习笔记(1) -- 从函数式接口说起

    http://blog.csdn.net/zxhoo/article/details/38349011 函数式接口 理解Functional Interface(函数式接口,以下简称FI)是学习Jav ...

  8. BCB:UTF8Encode、AnsiToUtf8

    UTF8Encode: Call Utf8Encode to convert a Unicode string to UTF-8. WS is the Unicode string to conver ...

  9. centos7中文显示为小方块~~啊啊啊 求大佬们解答

    这个问题困扰我很久了,刚好前几天注册了博客园,就想问问大佬们是怎么解决中文显示小方块的? 我试了很多办法,包括但不限于修改i18n配置文件,locale.conf,添加中文字体库等等等... 但都没有 ...

  10. MySQL查询显示连续的结果

    #mysql中 对于查询结果只显示n条连续行的问题# 在领扣上碰到的一个题目:求满足条件的连续3行结果的显示 X city built a new stadium, each day many peo ...