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

/*

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-08-31 22:14:24

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

PHP按行读取文件时删除换行符的3种方法_php实例

PHP按行读取文件 去掉换行符"\n": 第一种: 复制代码 代码如下: $content=str_replace("\n","",$content);echo $content; 或者: 复制代码 代码如下: $content=str_replace(array("\n","\r"),"",$content); 第二种: 复制代码 代码如下: $content=preg_replace

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

一.简单版 复制代码 代码如下:  import java.io.FileInputStream; void readFileOnLine(){ String strFileName = "Filename.txt"; FileInputStream fis = openFileInput(strFileName); StringBuffer sBuffer = new StringBuffer(); DataInputStream dataIO = new DataInputStre

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

一.简单版 复制代码 代码如下:  import java.io.FileInputStream; void readFileOnLine(){ String strFileName = "Filename.txt"; FileInputStream fis = openFileInput(strFileName); StringBuffer sBuffer = new StringBuffer(); DataInputStream dataIO = new DataInputStre

豆瓣-关于C语言按行读取文件,读取其中数字,挨个转换成doube类型,存入数组

问题描述 关于C语言按行读取文件,读取其中数字,挨个转换成doube类型,存入数组 int main() { FILE *fp; char buffer[50]; char filename[50]; int bufferLen; int i; int j = 0; char c; double c_number[50]; printf("Input file name: "); scanf("%s", filename); if((fp = fopen(filen

Python按行读取文件的实现方法【小文件和大文件读取】_python

本文实例讲述了Python按行读取文件的实现方法.分享给大家供大家参考,具体如下: 小文件: #coding=utf-8 #author: walker #date: 2013-12-30 #function: 按行读取小文件 all_lines = [] try: file = open('txt.txt', 'r') all_lines = file.readlines() except IOError as err: print('File error: ' + str(err)) fin

Java文件操作之按行读取文件和遍历目录的方法_java

按行读取文件 package test; import java.io.*; import java.util.*; public class ReadTest { public static List<String> first_list; public static List<String> second_list; public ReadTest() { first_list = new LinkedList<>(); second_list = new Link

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_f

PHP按行读取文件时删除换行符的3种方法

  这篇文章主要介绍了PHP按行读取文件时删除换行符的3种方法,需要的朋友可以参考下 PHP按行读取文件 去掉换行符"n": 第一种: 代码如下:$content=str_replace("n","",$content); echo $content; 或者: 代码如下:$content=str_replace(array("n","r"),"",$content); 第二种: 代码如下

sql-C# 按行读取txt文本内容导入数据库SQL(1)第二行数据就从第二列插入(2)索引超出了数组界限?

问题描述 C# 按行读取txt文本内容导入数据库SQL(1)第二行数据就从第二列插入(2)索引超出了数组界限? 都是按行读取txt内容,(因为有两行数据和其他的不一样)用正则分析出来,赋给一个字符串数组, 将一个字符串数组的每个值一次写入数据库行的对应列.一行读取完成. 可是却显示,索引超出了数组界限,数组个数和行对应的 .将读取出来的数据显示在textBox中是正确的, 但是奇怪的是也确实是导入进去了,数据库中表格有了数据 最终结果似乎对的,除了第二行第一列没有数据.谢谢,刚入手,第一个程序!