一、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);//输出字符串必须有大小