C++/C 中.txt文件读写方法学习

一、ifstream fin与ofstream fout;
1、主要步骤,以打开文件为例

ifstream fin; 
fin.open(FILE_IN_NUM);
//FILE_IN_NUM为文件名,格式:#define FILE_IN_NUM "F:\\C++\\Test\\Test_FileRandW\\DataFirst.TXT"
if(!fin.is_open())       //判断是否成功打开 
	{
		cout<<"Open FILE_IN_NUM fail!";
	} 
while(!fin.eof())   //是否到文末 
	{
	//循环内内容自定
		fin>>v>>w>>weight;//按格式读入
		value[v][w]=weight;//定义的存储数组
		value[w][v]=weight;
	}
fin.close();//关闭资源

2、具体事例:
(1)txt文件构成:
含char字符
在这里插入图片描述
只有整数:
在这里插入图片描述
(2)代码:

#include <iostream>
#include <fstream>
#include <string.h>

//注意要双斜杠,原因是 \ 会被误认为转义符 
#define FILE_IN_NUM "F:\\C++\\Test\\Test_FileRandW\\DataFirst.TXT"
#define FILE_OUT_NUM "F:\\C++\\Test\\Test_FileRandW\\ResultFirst.TXT" 
#define FILE_IN_CHAR "F:\\C++\\Test\\Test_FileRandW\\DataChar.TXT"
#define FILE_OUT_CHAR "F:\\C++\\Test\\Test_FileRandW\\ResultChar.TXT" 

using namespace std;

//对于全是整数的txt文件 
void AllNumOpen()
{
	int v,w,weight;
	int value[10][10];
	memset(value,0,sizeof(value));
	ifstream fin;            //文件输入流 
	ofstream fout;           //文件输出流  
	fin.open(FILE_IN_NUM);
	if(!fin.is_open())       //判断是否成功打开 
	{
		cout<<"Open FILE_IN_NUM fail!";
	} 
	while(!fin.eof())   //是否到文末 
	{
		fin>>v>>w>>weight;
		value[v][w]=weight;
		value[w][v]=weight;
	}
	fin.close();
	
	fout.open(FILE_OUT_NUM);
	if(!fout.is_open())
	{
		cout<<"Open FILE_OUT_NUM fail!";
	} 
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		{
			fout<<i<<' '<<j<<' '<<value[i][j]<<endl;
		}
	}
	fout.close();
} 


//对于含整数以及字符型文件读写 
void CharOpen(){
	int v,w,weight;
	char c;
	char ch[10][10];
	memset(ch,'*', sizeof(ch)); 
	int value[10][10];
	memset(value,0,sizeof(value));
	ifstream fin;
	ofstream fout;
	fin.open(FILE_IN_CHAR);
	if(!fin.is_open())
	{
		cout<<"Open FILE_IN fail!";
	} 
	while(!fin.eof())
	{
		fin>>v>>w>>weight>>c;
		value[v][w]=weight;
		value[w][v]=weight;
		ch[v][w]=c;
		ch[w][v]=c;
	}
	fin.close();
	
	fout.open(FILE_OUT_CHAR);
	if(!fout.is_open())
	{
		cout<<"Open FILE_OUT fail!";
	} 
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		{
			fout<<i<<' '<<j<<' '<<value[i][j]<<' '<<ch[i][j]<<endl;
		}
	}
	fout.close();
} 

int main()
{
	AllNumOpen();
	CharOpen();
	return 0;
}

(3)结果txt文件:

含char的输出
在这里插入图片描述
只有整数输出:
在这里插入图片描述
上面两个结果txt只有部分内容截图;

二、FILE 类
1、具体步骤:

FILE *fin;
fopen_s(&fin, FILE_IN_STRING,"r");
if(!fin)
{
	cout<<"Open FILE_IN_NUM Fail!"<<endl;
}
while(fscanf_s(fin,"%d\t",&v)!=-1)
	{
	//循环里面及循环判断根据具体文件内的内容格式,这只是一个测试样例
		fscanf_s(fin, "%d\t", &w);
		fscanf_s(fin, "%d\t", &weight);
		value[v][w]=weight;
		value[w][v]=weight;
		fscanf_s(fin, "%s", &c, 10);//输出字符串必须有大小 
		strcpy_s(str[w][v].cha, c);
		strcpy_s(str[v][w].cha, c);
	}
	fclose(fin);

2、具体示例:
(1)txt文件样式
在这里插入图片描述
(2)代码
*这个可以被没有gcc的编译器编译成功

#include <cstring>

//注意要双斜杠,原因是 \ 会被误认为转义符 
#define FILE_OUT_STRING "F:\\C++\\Test\\Test_FileRandW\\ResultString.TXT"
#define FILE_IN_STRING "F:\\C++\\Test\\Test_FileRandW\\DataString.TXT" 

using namespace std;

//注意fopen与fopen_s等的区别;
//注意C中没有string;
//注意字符串的赋值用strcpy,如果用=需要重载运算符; 
//注意memset,strcpy函数的头文件:cstring; 
//OpenFile()可以在gcc中编译成功,但是在没有gcc的编译器中不能成功; 

struct Str{
	char cha[10]={'*'};//初始化为*
};
void OpenFile_C()
{
	FILE *fin;
	fin=fopen(FILE_IN_STRING,"r");
	if(!fin)
	{
		cout<<"Open FILE_IN_NUM Fail!"<<endl;
	}
	int v,w,weight;
	int v1, w1;
	int value[10][10];
	memset(value, 0, sizeof(value));//头文件:cstring; 
	Str str[10][10];
	char c[10];
	while(fscanf(fin,"%d\t",&v)!=-1)
	{
		fscanf(fin, "%d\t", &w);
		fscanf(fin, "%d\t", &weight);
		value[v][w]=weight;
		value[w][v]=weight;
		fscanf(fin, "%s", &c, 10);
		//str[w][v].cha=c;//定义char型数组来获取字符串,并且不能直接用=赋值,strcpy头文件:cstring; 
		strcpy(str[w][v].cha,c);
		strcpy(str[v][w].cha,c);
	}
	fclose(fin);
	FILE *fout; 
	fout=fopen(FILE_OUT_STRING,"w");
	if(!fout)
	{
		cout<<"Open FILE_OUT_STRING FAIL!"<<endl;
	}
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		{
			cout<<i<<j<<value[i][j]<<str[i][j].cha<<endl;
			 fprintf(fout,"%d\t%d\t%d\t%s\r\n",i,j,value[i][j],str[i][j].cha);//注意C中没有string型,所以建立struct Str 
		}
	}
	fclose(fout);
}
int main()
{
	OpenFile_C();
	system("pause");
	return 0;
}

*这个可以在有gcc的编译器里编译成功

#include <cstring>

//注意要双斜杠,原因是 \ 会被误认为转义符 
#define FILE_OUT_STRING "F:\\C++\\Test\\Test_FileRandW\\ResultString.TXT"
#define FILE_IN_STRING "F:\\C++\\Test\\Test_FileRandW\\DataString.TXT" 

using namespace std;

struct Str{
	char cha[10]={'*'};//初始化为*
};
void OpenFile()
{
	FILE *fin;
	fopen_s(&fin, FILE_IN_STRING,"r");
	if(!fin)
	{
		cout<<"Open FILE_IN_NUM Fail!"<<endl;
	}
	int v,w,weight;
	int v1, w1;
	int value[10][10];
	memset(value, 0, sizeof(value));
	Str str[10][10];
	char c[10];
	while(fscanf_s(fin,"%d\t",&v)!=-1)
	{
		fscanf_s(fin, "%d\t", &w);
		fscanf_s(fin, "%d\t", &weight);
		value[v][w]=weight;
		value[w][v]=weight;
		fscanf_s(fin, "%s", &c, 10);//输出字符串必须有大小 
		//str[w][v].cha=c;//定义char型数组来获取字符串 
		//str[v][w].cha=c;
		strcpy_s(str[w][v].cha, c);
		strcpy_s(str[v][w].cha, c);
	}
	fclose(fin);
	FILE *fout; 
	fopen_s(&fout,FILE_OUT_STRING,"w");
	if(!fout)
	{
		cout<<"Open FILE_OUT_STRING FAIL!"<<endl;
	}
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		{
			cout<<i<<j<<value[i][j]<<str[i][j].cha<<endl;
			fprintf_s(fout,"%d\t%d\t%d\t%s\r\n",i,j,value[i][j],str[i][j].cha);
		}
	}
	fclose(fout);
}
int main()
{
	OpenFile();
	system("pause");
	return 0;
}

(3)结果:
在这里插入图片描述
三、这里主要是学习过程中的一些注意事项:
//注意fopen与fopen_s等的区别;
//注意字符串的赋值用strcpy,如果用=需要重载运算符;
//注意memset,strcpy函数的头文件:cstring;
//OpenFile()可以在gcc中编译成功,但是在没有gcc的编译器中不能成功;
//fscanf_s(fin, “%s”, &c, 10);//输出字符串必须有大小

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值