C|文件写、读(读到字符数组、指针)及如何避免垃圾数据

文件可以读入到字符数组,也可以读入到动态分配的字符指针等数据结构中,需要注意的是,如果数组的长度或动态分配的长度与文件的长度不一致时,需要注意保存文件内容的数据结构初始化为0值,避免垃圾数据的存在,因为字符串是未尾元素为“\0”的字符数组。

细节请见小实例中的代码备注及注销掉的代码:

以下是是否有使用memset()函数将数据结构初始化为0值的不同运行效果:

附代码:

#include<windows.h>
#include <string>
int flen(char* fpath)		// file length
{
	FILE *fp;
	fp = fopen(fpath,"r");
	fseek(fp,0,SEEK_END); 		// 把文件指针移到文件末尾
	int n = ftell(fp); 		// 得到文件长度
	rewind(fp); 				// 把指针移回文件头 fseek(pFile,0,SEEK_BEGIN)
	return n;
}
void fw(char* fpath)						// write file
{
	FILE *fp;
	fp = fopen(fpath,"w");
	fwrite("hi,\n\r",1,strlen("hi,\n\r"),fp);
	char *chs = "test text字符测试";
	fwrite(chs,1,strlen(chs),fp);
	//fwrite(chs,1,strlen(chs)+1,fp); 
	// 最后一个fwrite多写入一个空字符,以在后面读取时避免垃圾数据
	fclose(fp);
}
void fr(char* fpath)						// read file to a char[]
{
	FILE *fp;
	fp = fopen(fpath,"r");
	char chs[100];
	//char chs[100]="0";		// 数组被赋值为全零,防止写入垃圾数据,
	memset(chs,0,100);			// 把数组赋为全零的另一种方法
	fread(chs,1,100,fp);
	MessageBox(NULL,chs,"fr",NULL);
	fclose(fp);
}
void fr2(char* fpath)						// read file2 to a char* (dynamic allocate)
{
	FILE *fp;
	fp = fopen(fpath,"r");
	int n = flen(fpath);
	//char *pbuf = new char[n];
 char *pbuf = (char*)malloc(sizeof(char)*n);
 	memset(pbuf,0,n);			// 把数组赋为全零的另一种方法
 	fread(pbuf,1,n,fp);
 	MessageBox(NULL,pbuf,"fr2",NULL);
 	fclose(fp);
	//delete pbuf;
	free(pbuf);
 }
 int main()
 {
 	char *fpath = "test.txt";
	fw(fpath);
	fr(fpath);
	fr2(fpath);
 return 0;
}

—End—

举报
评论 0