c语言读取每一行,再将符合条件的写入另一个文件中。
2015-11-19 10:15
459 查看
已经很久没有碰过c语言了,可能很多同学都觉得so easy。重新拾起来还是有点害怕&激动。
拾起来的时候犯了很多新手会返的错误,对不起大学老师了。╮( ̄▽ ̄")╭
写这玩意的原因是开发扔了一份gc.log给我,打出来的是详细信息,
比如:
但是我可能不太需要具体的线程停止的时间,比如:
所以就想自己从开发给予的格式转换到当前想要的格式。
OK,正常的思路就是读取文件中的每一行,当行首字为数字(“2”)时,将这行读到新创建的文件中。
其实很简单有木有。然而我还是写了两个小时。我有罪。
先介绍一下使用到的函数。
fopen (FILE *filename)/fclose(FILE *filename)
顾名思义就是打开文件了。
有打开就有关闭。它们是一对好基友。☺
这边只要注意打开可能会不成功,那么愉快地加上一个判断条件,为空就提示“Error!”。
feof(FILE *filename)
用来检查流上的文件是否结束了。是一个结束的标识符end-of-file。
如果有过acm经验的小伙伴一定对EOF很熟悉。
可能会问:feof()可以用EOF代替吗?
不可以哦。fgetc返回-1时,有两种情况:读到文件结尾或是读取错误。因此我们无法确信文件已经结束, 因为可能是读取错误!
这时我们需要feof()。
fgets(char buf, int bufsize,
FILE *filename)
从文本结构体指针stream中读取数据,每次读取一行。
读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0').
如果文件中的该行,不足bufsize个字符,则读完该行就结束。
如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。
函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。
int isdigit()
判断是不是数字,是数字返回非零值;不是数字返回零。
by the way, #include <ctype.h>这个下面有好多好东西。像我那么挫的,一开始想用strcmp去比较读取的行首字是不是数字,结果显示没有isdigit好用。
fputs(char buf, FILE *filename)
读取判断都完成之后需要去写入,不是很难。
实际上这样就完成了,但是我想充分利用一下开发的数据,统计了每次有多少线程因为GC停止。
实际的代码如下所示:
还有一些读写文件的其他函数和文件模式,可以参考/article/4884210.html
拾起来的时候犯了很多新手会返的错误,对不起大学老师了。╮( ̄▽ ̄")╭
写这玩意的原因是开发扔了一份gc.log给我,打出来的是详细信息,
比如:
<span style="font-family:Comic Sans MS;">2015-10-29T20:16:13.757+0800: 4.237: [GC [PSYoungGen: 1280000K->25644K(1493312K)] 1280000K->25644K(4906688K), 0.0096300 secs] [Times: user=0.05 sys=0.04, real=0.01 secs] Total time for which application threads were stopped: 0.0098530 seconds Application time: 0.0020110 seconds Total time for which application threads were stopped: 0.0001470 seconds Application time: 0.0000300 seconds Total time for which application threads were stopped: 0.0002440 seconds Application time: 0.0000300 seconds Total time for which application threads were stopped: 0.0001120 seconds Application time: 0.0000540 seconds Total time for which application threads were stopped: 0.0001960 seconds Application time: 0.0000270 seconds Total time for which application threads were stopped: 0.0000570 seconds Application time: 0.0000420 seconds Total time for which application threads were stopped: 0.0001250 seconds Application time: 0.0000290 seconds Total time for which application threads were stopped: 0.0001090 seconds Application time: 0.0000270 seconds</span>
但是我可能不太需要具体的线程停止的时间,比如:
<span style="font-family:Comic Sans MS;">2015-10-31T23:03:46.204+0800: 182856.684: [GC [PSYoungGen: 1355299K->309811K(1237120K)] 4059775K->3237002K(4650496K), 0.0469180 secs] [Times: user=0.46 sys=0.00, real=0.04 secs] 2015-10-31T23:05:42.228+0800: 182972.708: [GC [PSYoungGen: 1237107K->260369K(1556288K)] 4164298K->3369121K(4969664K), 0.0405320 secs] [Times: user=0.39 sys=0.00, real=0.04 secs] 2015-10-31T23:07:17.002+0800: 183067.482: [GC [PSYoungGen: 1166225K->129644K(1014848K)] 4274977K->3449210K(4428224K), 0.0350170 secs] [Times: user=0.34 sys=0.00, real=0.04 secs] 2015-10-31T23:07:17.037+0800: 183067.517: [Full GC [PSYoungGen: 129644K->0K(1014848K)] [PSOldGen: 3319566K->2020541K(3413376K)] 3449210K->2020541K(4428224K) [PSPermGen: 134284K->134284K(216000K)], 0.8718420 secs] [Times: user=0.87 sys=0.00, real=0.87 secs] 2015-10-31T23:09:00.015+0800: 183170.495: [GC [PSYoungGen: 885175K->88131K(1529152K)] 2905716K->2108673K(4942528K), 0.0110240 secs] [Times: user=0.10 sys=0.00, real=0.01 secs] </span><span style="font-family:Microsoft YaHei;"> </span>
所以就想自己从开发给予的格式转换到当前想要的格式。
OK,正常的思路就是读取文件中的每一行,当行首字为数字(“2”)时,将这行读到新创建的文件中。
其实很简单有木有。然而我还是写了两个小时。我有罪。
先介绍一下使用到的函数。
fopen (FILE *filename)/fclose(FILE *filename)
顾名思义就是打开文件了。
有打开就有关闭。它们是一对好基友。☺
这边只要注意打开可能会不成功,那么愉快地加上一个判断条件,为空就提示“Error!”。
<span style="font-family:Comic Sans MS;">if((NULL == fr)||(NULL == fw) ) </span>
feof(FILE *filename)
用来检查流上的文件是否结束了。是一个结束的标识符end-of-file。
如果有过acm经验的小伙伴一定对EOF很熟悉。
<span style="font-family:Comic Sans MS;font-size:10px;">while (scanf("%d",&n),n!=EOF) //while(scanf("%d",&n)!=EOF)</span>如果文件结束,则返回非0值,否则返回0。
可能会问:feof()可以用EOF代替吗?
不可以哦。fgetc返回-1时,有两种情况:读到文件结尾或是读取错误。因此我们无法确信文件已经结束, 因为可能是读取错误!
这时我们需要feof()。
fgets(char buf, int bufsize,
FILE *filename)
从文本结构体指针stream中读取数据,每次读取一行。
读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0').
如果文件中的该行,不足bufsize个字符,则读完该行就结束。
如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。
函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。
int isdigit()
判断是不是数字,是数字返回非零值;不是数字返回零。
by the way, #include <ctype.h>这个下面有好多好东西。像我那么挫的,一开始想用strcmp去比较读取的行首字是不是数字,结果显示没有isdigit好用。
fputs(char buf, FILE *filename)
读取判断都完成之后需要去写入,不是很难。
实际上这样就完成了,但是我想充分利用一下开发的数据,统计了每次有多少线程因为GC停止。
实际的代码如下所示:
<span style="font-family:Comic Sans MS;">#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> int main() { FILE *fr, *fw; int i = 0; char filername[] = "E:\\document\\gc.log"; //文件名 char filewname[] = "E:\\document\\gc-w.log"; //文件名 char strLine[1024]; //每行最多读取的字符数 int str = -1; fr = fopen(filername, "r"); fw = fopen(filewname, "wt+"); if((NULL == fr)||(NULL == fw) ) //判断文件可读性 { printf("ERROR!\n"); return -1; } while(!feof(fr)) { i++; fgets(strLine, 1024, fr);//读取每一行 //printf("%s\n",strLine); str = isdigit(strLine[0]); //printf("str is %d\n",str); if (0 != str) { printf("i is %d\n",i); fputs(strLine, fw); //fprintf(fw,"%d threads are stopped\n", i); i = 0; } } fclose(fr); //关闭文件 fclose(fw); system("pause"); return 0; } </span>
还有一些读写文件的其他函数和文件模式,可以参考/article/4884210.html
相关文章推荐
- pImp机制--隐藏实现减小头文件依赖
- C/C++参数传递的3种方式
- 20.c/c++程序员面试宝典-引用与值传递
- C/C++与Python混合编程
- python调用C/C++动态链接库和jython
- (c/c++内存管理)堆和栈的区别
- C语言产生满足正态分布的随机数
- c语言va_list snprintf 的实现
- RTTI、虚函数和虚基类的开销分析及使用指导
- c语言:一组数据中只有一个数字出现了一次。(使用位运算)
- c语言:不使用(a+b)/2这种方式,求两个数的平均值。
- c语言:求1/n!从1到20的和
- c语言:求n!从1到20的和
- c语言:猴子吃桃问题
- c语言:一个球从 100 米高的自由落下,每次落地后反跳回原高度的一半
- c语言:有一个分数序列: 2/1+3/2+5/3+8/5+13/8+… 求出这个数列前 20 项的和
- strcat连接字符串函数
- 【C语言】【面试题】【笔试题】模拟实现数据库中strcmp函数
- c++ 11 多线线程系列-----------使用c++11 lambda创建线程
- python之自动生成C++的父子双向继承关系