实现按行读取文件,把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出。

/*

2 编写一个业务函数,实现按行读取文件。把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出。

函数原型有两个,任意选择其一

要求1:请自己任意选择一个接口(函数),并实现功能;70分

要求2:编写测试用例。30分

要求3:自己编写内存释放函数

*/

/**********************************************************************
* 版权所有 (C)2015, Wu Yingqiang。
*
* 文件名称:ReadFile.c
* 文件标识:无
* 内容摘要:利用二级指针,按行读取文件
* 其它说明:无
* 当前版本: V1.0
* 作    者: Wu Yingqiang
* 完成日期: 20150112
*
**********************************************************************/
#define _CRT_SECURE_NO_WARNINGS
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#define  LineMaxLen 1024*2 //每行最大的字符个数
/**********************************************************************
* 功能描述:将文件的内容读取到内存中
* 输入参数:pfilename-文件名称,全路径;lineNum--文件的行数
* 输出参数:lineNum--文件的行数
* 返 回 值:文件内容在内存中的首地址
* 其它说明:无
* 修改日期        版本号            修改人            修改内容
* -------------------------------------------------------------------
* 20150112       V1.0               Wu Yingqiang      创建
***********************************************************************/
char **ReadFile(const char *pfilename/*in*/, int *lineNum/*in out*/)
{
	int      rv = 0, tmplineNum = 0;
	FILE    *fp = NULL;
	char    lineBuf[LineMaxLen];
	char    *pTmp = NULL;
	char    **tmpFile = NULL;
	if (pfilename == NULL || lineNum == NULL)
	{
		rv = -1;
		printf("ReadFile() err. param err \n");
		goto End;
	}
	fp = fopen(pfilename, "r");
	if (fp == NULL)
	{
		rv = -2;
		printf("fopen() err. \n");
		goto End;
	}
	//第一遍读出多少行
	while (!feof(fp))
	{
		//读每一行
		memset(lineBuf, 0, sizeof(lineBuf));
		pTmp = fgets(lineBuf, LineMaxLen, fp);
		if (pTmp == NULL)
		{
			continue;
		}
		else
		{
			tmplineNum++;
		}
	}
	tmpFile = (char **)malloc((tmplineNum + 1)*sizeof(char *));
	if (tmpFile == NULL)
	{
		goto End;
	}
	//第二遍读内容
	//准备环境
	tmplineNum = 0;
	fseek(fp, 0L, SEEK_SET);
	while (!feof(fp))
	{
		//读每一行
		memset(lineBuf, 0, sizeof(lineBuf));
		pTmp = fgets(lineBuf, LineMaxLen, fp);
		if (pTmp == NULL)
		{
			continue;
		}
		else
		{
			int tmplen = strlen(lineBuf);
			tmpFile[tmplineNum] = (char *)malloc((tmplen + 1)*sizeof(char));
			if (tmpFile[tmplineNum] == NULL)
			{
				goto End;
			}
			strcpy(tmpFile[tmplineNum], lineBuf);
			//printf("%s", lineBuf);
			tmplineNum++;
		}
	}
End:
	if (fp != NULL)
	{
		fclose(fp);
	}
	*lineNum = tmplineNum;
	return tmpFile;
}
/**********************************************************************
* 功能描述:释放文件内容在内存中的内存
* 输入参数:p--文件内容在内存中的首地址,lineNUm--文件的行数
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期        版本号            修改人            修改内容
* -------------------------------------------------------------------
* 20150112       V1.0               Wu Yingqiang      创建
***********************************************************************/
void ReadFileFree(char **p, int lineNUm)
{
	int i = 0;
	if (p == NULL)
	{
		return;
	}
	for (i = 0; i<lineNUm; i++)
	{
		free(p[i]);
	}
	free(p);
}
/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期        版本号           修改人            修改内容
* -------------------------------------------------------------------
* 20150112       V1.0              Wu Yingqiang      创建
***********************************************************************/
void main()
{
	char **p = NULL;
	const char *pfilename = "e:/1.txt";//E:\\1.txt
	int lineNum = 0, i = 0;
	p = ReadFile(pfilename/*in*/, &lineNum/*in out*/);
	if (p == NULL)
	{
		return;
	}
	for (i = 0; i<lineNum; i++)
	{
		printf("%s", p[i]);
	}
	ReadFileFree(p, lineNum);
	system("pause");
}
				
时间: 2024-10-17 04:10:13

实现按行读取文件,把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出。的相关文章

Python跳过第一行读取文件内容

Python编程时,经常需要跳过第一行读取文件内容.比较容易想到是为每行设置一个line_num,然后判断line_num是否为1,如果不等于1,则进行读取操作.相应的Python代码如下: [python] view plain copy input_file = open("C:\\Python34\\test.csv") line_num = 0 for line in islice(input_file, 1, None): line_num += 1 if (line_num

23 遍历删除本地目录的方法,文件末尾追加内容,按行读取文件内容

1.遍历删除本地目录 /** * 递归删除非空目录 * @param file */ public static void deletNotEmptyDir(File file){ File[] files = file.listFiles(); if (files != null) { for (File f : files) { deletNotEmptyDir(f); } } file.delete(); } 2.文件末尾追加内容 /** * 在文件末尾追加字符串 * @param fil

android按行读取文件内容的几个方法

一.简单版 1 import java.io.FileInputStream; 2 void readFileOnLine(){ 3 String strFileName = "Filename.txt"; 4 FileInputStream fis = openFileInput(strFileName); 5 StringBuffer sBuffer = new StringBuffer(); 6 DataInputStream dataIO = new DataInputStre

Java如何实现按指定行读取文件

最近在开发实战中,遇到了一个这样的技术情景: 把log4j生成的日志文件定时刷进MySQL数据库,比如三个小时刷一次,那么每次刷数据的时候,如何控制文件读取是从上一次文件读取结束的地方开始继续读取的?并且本次要读取到文件结尾处.在网上各种搜索提问后,找到了一个叫RandomAccessFile Java类解决了问题. 先上代码: static int size=1;//主要是为了控制循环的次数,因为是定时刷,每次刷的文件行数可能不一样 static long chars=0;//chars指的是

C++/Php/Python/Shell 程序按行读取文件或者控制台

写程序经常需要用到从文件或者标准输入中按行读取信息,这里汇总一下.方便使用 1. C++ 读取文件 1 #include<stdio.h> 2 #include<string.h> 3 4 int main(){ 5 const char* in_file = "input_file_name"; 6 const char* out_file = "output_file_name"; 7 8 FILE *p_in = fopen(in_fi

【Python】按行读取文件、IOError: [Errno 22] invalid mode (&#39;a+&#39;) or filename,处理文件的换行符

Python一次性读取文件的所有内容在<[Python]文件读写操作>(点击打开链接)中已经说明过的,但有些时候,需要对文件中的每一行进行处理. 比如有一个f:\1.txt如下: 此时,如果要按行读取这个文件,可以直接利用Pyhon的for循环来读取,其中for的对象是这个文件指针,代码如下: file_path="f:\\a.txt" fp=open(file_path,"a+"); for eachline in fp: print eachline

python 按每行读取文件怎么去掉换行符

python按每行读取文件后,会在每行末尾带上换行符,这样非常不方便后续业务处理逻辑,需要去掉每行的换行符,怎么去掉呢?看下面的案例: >>> a = "hello world\n" >>> print a #可以看到hello world下面空了一格 hello world >>> a.split() #通过split方法将字符转换成列表 ['hello', 'world'] #从列表中取第一个字符 >>> a.

Java利用内存映射文件实现按行读取文件

我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好更快的实现方式麻烦也提供一下代码. 代码如下: public class testMemoryMappedFile { public static void main(String[] agrs) throws IOException{ RandomAccessFile memoryMappedFi

小时代5-perl跳过首行读取文件

如何跳过文件首行读取文件呢?我们可以使用readline来实现,打开文件后,首先readline,然后再使用while继续读取文件的其他行进行处理.这种方法比较适合同时处理多个文件的场景,具体的实现方式如下: #!/usr/bin/perl open( READ, "<$file" ); readline READ; # skip the first line while (<READ>) { ... } close READ; 当然如果有其他更好的方法,也可以在这里