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

 

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

 

今天帮同学处理一个有规律的文件数据。

第一种情况:

总共1600行,文件数据格式如下:

0:281  1:687  2:309  3:29  4:101  5:871  6:26  7:5  8:0  9:0  
0:1286  1:166  2:298  3:291  4:0  5:106  6:74  7:35  8:0  9:54  
0:523  1:289  2:369  3:66  4:908  5:16  6:109  7:25  8:0  9:1  
0:187  1:318  2:391  3:0  4:533  5:410  6:430  7:19  8:3  9:18  
0:7  1:1225  2:856  3:0  4:0  5:174  6:0  7:48  8:0  9:0  
0:826  1:876  2:182  3:5  4:5  5:0  6:393  7:24  8:0  9:0  
0:603  1:906  2:288  3:73  4:90  5:326  6:13  7:12  8:0  9:0  
0:109  1:775  2:528  3:60  4:626  5:0  6:193  7:18  8:0  9:0  
0:261  1:1318  2:444  3:33  4:0  5:197  6:27  7:35  8:0  9:0  
0:507  1:671  2:798  3:40  4:0  5:0  6:0  7:91  8:203  9:2 </span>

要求:将每组数据冒号和冒号之前的数据去掉。

处理完之后部分文件数据格式:

281  687  309  29  101  871  26  5  0  0  
1286  166  298  291  0  106  74  35  0  54  
523  289  369  66  908  16  109  25  0  1  
187  318  391  0  533  410  430  19  3  18  
7  1225  856  0  0  174  0  48  0  0  
826  876  182  5  5  0  393  24  0  0  
603  906  288  73  90  326  13  12  0  0  
109  775  528  60  626  0  193  18  0  0  
261  1318  444  33  0  197  27  35  0  0  
507  671  798  40  0  0  0  91  203  2 </span>

 

编程方法,想到两种。

第一种方法:利用fgetc()和fputc().

方法原理:其实就是想办法只读取冒号和空格之间的数据,以及换行符,其他的数据跳过。每次读取一个字符数据,找到分号':',开始读取字符数据到目标文件,直到碰到空格,此时第一组数据读取完毕。当读到的字符数据为换行符'\n'时,向目标文件写一个换行符'\n'。

代码如下:

/*************************************************************************
	> File Name: datahandle1.c
	> Author: Geng
	> Mail: genglut@163.com
	> Created Time: Thu 30 Oct 2014 01:54:56 PM CST
 ************************************************************************/

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

int main(void)
{
        FILE *filesrc, *filedest;
        char ch;
        if((filesrc = fopen("data.txt", "r")) == NULL)
		{
			perror("fopen");
			exit(EXIT_FAILURE);
		}
        if((filedest = fopen("getdata.txt", "w")) == NULL)
		{
			perror("fopen");
			exit(EXIT_FAILURE);
		}		
        
        while(!feof(filesrc))//判断文件是否结束
        {
                if((ch = fgetc(filesrc)) == ':')//找分号
                {
			while ((ch = fgetc(filesrc)) != ' ')//读取分号之后和空格之间的数据到目标文件
				fputc(ch, filedest);//读取字符数据到目标文件
							
				fputc(' ', filedest);//第一组数据读完后,加入两个空格
				fputc(' ', filedest);
                }
		if(ch == '\n')//判断是否为行末尾,即是否读到了换行符,是则向目标文件写一个换行符进行换行
			fputc('\n', filedest);
        }
        return 0;
}

 

第二种方法:利用格式化输入输出函数fprintf()和fscanf().

方法原理:找到文件数据规律,数据组全为xx:xx格式,所以只需格式化读取源文件,然后格式化写入目标文件即可。此外,每行数据组格式均为10,所以,可以10为判断依据,向目标文件写入换行符。

代码如下:

/*************************************************************************
	> File Name: datahandle.c
	> Author: Geng
	> Mail: genglut@163.com
	> Created Time: Thu 30 Oct 2014 01:54:32 PM CST
 ************************************************************************/

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

int main(void)
{
        FILE *filesrc, *filedest;
        int word1, word2, temp;
		temp = 0;
        if((filesrc = fopen("data.txt", "r")) == NULL)
		{
			perror("fopen");
			exit(EXIT_FAILURE);
		}
        if((filedest = fopen("getdata.txt", "w")) == NULL)
		{
			perror("fopen");
			exit(EXIT_FAILURE);
		}		
        while(!feof(filesrc))//判断文件是否结束
        {
			if(temp == 10)//已经读完一行数据
			{
				temp = 0;
				fprintf(filedest, "%s", "\n");//向目标文件写入换行符					
			}
			fscanf(filesrc, "%d:%d", &word1, &word2);//格式化读取源文件
			fprintf(filedest, "%d  ", word2);//格式化写入目标文件
			temp++;
        }
        return 0;
}

 

第二种情况:

总共800行,部分原数据格式:

4 401:1 402:1 403:1 404:1
5 501:1 502:1 503:1 504:1 505:5
3 301:1 302:2 303:4
6 601:1 602:2 603:3 604:4 605:5 606:6

要求:将每组数据冒号和冒号之后的数据去掉,并且将每行首个数字去掉。

处理完之后部分文件数据格式:

401  402  403  404  
501  502  503  504  505  
301  302  303
601  602  603  604  605  606

编程方法,利用fgetc()和fputc().
方法原理:其实就是想办法只读取空格和冒号之间的数据,以及换行符,其他的数据跳过。每次读取一个字符数据,找到分号' ',开始读取字符数据到目标文件,直到碰到空格,此时第一组数据读取完毕。当读到的字符数据为换行符'\n'时,向目标文件写一个换行符'\n'。

示例代码:

/*************************************************************************
	> File Name: data.c
	> Author: Geng
	> Mail: genglut@163.com
	> Created Time: Sat 01 Nov 2014 04:12:12 PM CST
 ************************************************************************/

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

int main(void)
{
	FILE *filesrc, *filedest;
	char ch;
	if((filesrc = fopen("data.txt", "r")) == NULL)
	{
		perror("fopen");
		exit(EXIT_FAILURE);
	}
	if((filedest = fopen("dataget.txt", "w")) == NULL)
	{
		perror("fopen");
		exit(EXIT_FAILURE);	
	}
	while(!feof(filesrc))
	{
		if((ch = fgetc(filesrc)) == ' ')//找空格
		{			
			while ((ch = fgetc(filesrc)) != ':')//找冒号
			{
				if(ch == '\n')//找换行符
				{
					fputc('\n', filedest);
					break;//跳出当前的while循环
				}
				else
					fputc(ch, filedest);
			}
			if(ch != '\n')//如果不是换行符,加上两个空格,就是为了把数据分开
			{
				fputc(' ', filedest);
				fputc(' ', filedest);
			}
		}
	}
	return 0;
}


 

原文链接:http://blog.csdn.net/geng823/article/details/40618471

 

posted @ 2014-10-30 14:01  GengLUT  阅读(249)  评论(0编辑  收藏  举报