c语言读取每一行,再将符合条件的写入另一个文件中。

原创 2015年11月19日 10:15:41

已经很久没有碰过c语言了,可能很多同学都觉得so easy。重新拾起来还是有点害怕&激动。

拾起来的时候犯了很多新手会返的错误,对不起大学老师了。╮( ̄▽ ̄")╭


写这玩意的原因是开发扔了一份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>

还有一些读写文件的其他函数和文件模式,可以参考http://www.cnblogs.com/Romi/archive/2012/02/29/2374769.html







版权声明:本文为博主原创文章,未经博主允许不得转载。ヾ(≧へ≦)〃

C语言文件操作——读一行和写一行

文件读写

LINUX C语言,在文本中某一行插入内容

这个不能直接插入, 因为数据在文件中存储是顺序存储的, 你插入的数据会覆盖掉后面的内容, 只有把插入点位置后面的数据都读取出来存着, 然后在文件指针处插入你要写的数据, 最后将你保存的数据再写到文件,...

c语言中如何把一个文件中的内容复制到另外一个文件中的代码

#include #include void copyFile() { FILE *in, *out; char ch ; if ((in = fopen("in.txt","r")) == NU...

c语言 读取文件的每一行; 查找指定key的value

#include #include   int main() {     int ret;     char *p, *q;     char str[16]="DISTRIB_TARGET=";...

[C/C++]_[初级]_[读取文件,每次读取一行并显示]

场景:读取大数据文件,一段一段进行读取,以节省一下读取文件内存占用大的问题,并且这样效率也不高。 下面是读取一行数据进行处理,每次读取的大小都是固定的,直到读完为止。 #include ...

C中读取一行一行的读取文件

C++中: #include #include #include using namespace std; int main() { string s; ifstream fp("t...

如何利用C/C++逐行读取txt文件中的字符串(可以顺便实现文本文件的复制)

如下代码均在Windows/VC++6.0下测试通过, 请注意linux和Windows文件格式的区别。 先用C语言写一个丑陋的程序:...
  • stpeace
  • stpeace
  • 2013年10月07日 22:28
  • 121109

C语言创建一个文件,写入数据并换行,再依次读取每行的数据,将读取的行数据以一定的格式命名为另一文件的文件名

#include #include #include #include #include //********************************* //字符串连...
  • flysh05
  • flysh05
  • 2013年11月25日 18:50
  • 3547

C语言读取指定行文本

当Loadrunner参数文件,每行取值文件过长且难以保存成功时,可以尝试使用读取文件行的方式取参数。...

c语言一行一行的读取txt文件

工作中做的项目,经常需要读取一些脚本,就是一些txt文件,用python读取很简单,但是我们很多工具也是用c/c++语言写的,用c的话读取文件我一般是按照如下的方式:while(fscanf(pFil...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言读取每一行,再将符合条件的写入另一个文件中。
举报原因:
原因补充:

(最多只允许输入30个字)