【原创】C语言处理文件数据(5) 分类: Linux --- C 2015-04-23 15:02 40人阅读 评论(0) 收藏

【原创】C语言处理文件数据(5)

原数据文件1格式

1
1
1
1
1
...
...

原数据文件2格式

1 3:1 10:1 12:8 17:1 23:8 27:1 29:6 30:7 33:10 42:12 ...
2 7:1 12:2 29:4 30:1 33:1 48:1 51:2 73:1 83:3 160:2 ...
3 12:3 16:1 23:3 25:1 27:1 29:8 30:5 33:14 42:5 51:1 ...
4 10:1 12:20 16:1 17:10 23:25 25:1 27:3 29:40 30:16  ...
5 12:3 16:1 23:8 29:12 30:8 31:1 33:8 41:3 42:5 51:2 ...
...
...

处理后数据文件格式

1 3:1 10:1 12:8 17:1 23:8 27:1 29:6 30:7 33:10 42:12 ...
1 7:1 12:2 29:4 30:1 33:1 48:1 51:2 73:1 83:3 160:2 ...
1 12:3 16:1 23:3 25:1 27:1 29:8 30:5 33:14 42:5 51:1 ...
1 10:1 12:20 16:1 17:10 23:25 25:1 27:3 29:40 30:16  ...
1 12:3 16:1 23:8 29:12 30:8 31:1 33:8 41:3 42:5 51:2 ...
...
...

要求:
从处理后的文件格式可以看出,要做的是,在文件2的基础上,用文件1的第一列替换掉文件2的第一列,得到需要的文件。
具体使用方法和源代码如下:

/*************************************************************************
    > File Name: data_fusion.c
    > Author: genglut
    > Mail: genglut@163.com
    > Created Time: 2015年04月22日 星期三 21时36分16秒
 ************************************************************************/

//要把程序放在data这个文件夹中,编译后运行
//具体用法如下
/*
[genglut@localhost data_fusion]$ gcc data_fusion.c -o data_fusion
[genglut@localhost data_fusion]$ ./data_fusion test.label test test_result 
把test.label test替换成对应的文件即可处理其他类似数据
*/

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
        FILE *filesrc_1, *filesrc_2, *filedest_result;
        char ch;

        if(4 != argc)//判断函数参数
        {
            printf("usage:\n./command  filesrc_1 filesrc_2 filedest_result\n");
            printf("如:\n./command  test.label test test_result\n");
            return -1;
        }

        if((filesrc_1 = fopen(argv[1], "r")) == NULL)//filesrc_1为原数据文件1,例如test.label
        {
            perror("fopen");
            exit(EXIT_FAILURE);
        }
        if((filesrc_2 = fopen(argv[2], "r")) == NULL)//filesrc_2为原数据文件2,例如test
        {
            perror("fopen");
            exit(EXIT_FAILURE);
        }
        if((filedest_result = fopen(argv[3], "w")) == NULL)
        //filedest_result为处理后的最终数据结果文件,自己定义名字
        {
            perror("fopen");
            exit(EXIT_FAILURE);
        }               

        while(!feof(filesrc_1)&&!feof(filesrc_2))
        {
            while (((ch = fgetc(filesrc_1)) != '\n'))//判断是否读到了行末尾
            {
                if(ch == EOF)//非常关键的一行代码!!!判断行的末尾字符是不是文件结束符EOF,如果没有这步判断,则无法跳出循环,即进入死循环。
                {
                    break;//如果是EOF,则跳出while循环
                }
                if((ch != '\r') && (ch != '\n'))//判断是否为回车符和换行符
                    fputc(ch, filedest_result);
            }

            while ((ch = fgetc(filesrc_2)) != ' ')//判断是否读到了空格
            {
                if(ch == EOF)//非常关键的一行代码!!!判断行的末尾字符是不是文件结束符EOF,如果没有这步判断,则无法跳出循环,即进入死循环。
                {
                    break;//如果是EOF,则跳出while循环
                }
            }

            fputc(' ', filedest_result);//添加空格

            while (((ch = fgetc(filesrc_2)) != '\n'))//判断是否读到了行末尾
            {
                if(ch == EOF)//非常关键的一行代码!!!判断行的末尾字符是不是文件结束符EOF,如果没有这步判断,则无法跳出循环,即进入死循环。
                {
                    break;//如果是EOF,则跳出while循环
                }
                if((ch != '\r') && (ch != '\n'))//判断是否为回车符和换行符
                    fputc(ch, filedest_result);
            }
            fputc('\n', filedest_result);//添加换行符
        }       
        return 0;
}

代码行

if((ch != '\r') && (ch != '\n'))//判断是否为回车符和换行符

用来解决windows下回车换行符号”\r\n”的问题。因为Linux下换行符为’\n’,如果不做处理,结果文件格式会有问题。
原文链接
http://blog.csdn.net/geng823/article/details/45221877

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-04-23 15:02  GengLUT  阅读(231)  评论(0编辑  收藏  举报