C++中常用的二维数组的建立与文件的操作方法
废话不多说,先讲C++一般如何创建二维数组的,这种方法是里面填什么数都可以,动态的。
[cpp]
int **M=new int*[hang]; //初始化行
for(int i=0;i<hang;i++)
{
M[i]=new int[lie];//初始化列,到了这里已经成功初始化数组了
for(int j=0;j<lie;j++)//这里开始给二维数组的每一个赋值
{
cin>>M[i][j];
}
}
上面就是这么一个过程,当然初值的赋值不一定要自己在命令行模式下输入。可以利用文件的方式,来输入。
下面介绍文件的输入输出操作。
基础知识:文件操作流 fstream 有两个子类:ifstream 和 ofstream ,ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。不过我们可以在构造的时候添加打开的模式(mode),也可以先
1、先说ofstream把程序(内存)里面的东西输出到文件(辅存)吧。
[cpp]
ofstream outfile("DATA.txt");
if(!outfile)return -1;
outfile<<"hello file!"; www.zzzyk.com
输出到文件,输出文件的目录是你的C源程序的目录。当然你也可以用下面那种方式输出:
[cpp]
ofstream outfile;
outfile.open("DATA.txt");
if(!outfile)return -1;
outfile<<"hello file!";
如果你想输出文件到一个绝对地址,例如D盘目录下,你把那个 DATA.txt 改为 D:\\DATA.txt ,记住是两个斜杠啊。前面一个是转义用的。如果你想把默认的输出方式改变,你可以利用下面的模式,来改变。
ios::in 打开一个输入文件,用这个标志作为ifstream的打开方式,以防止截断一个现成的文件
ios::out 打开一个输出文件,当用于一个没有ios::app、ios::ate或ios::in的ofstream时,ios::trunc被隐含
ios::app 以追加的方式打开一个输出文件
ios::ate 打开一现成文件(不论是输入还是输出)并寻找末尾
ios::nocreate 仅打开一个存在的文件(否则失败)
ios::noreplace 仅打开一个不存在的文件(否则失败)
ios::trunc 如果一个文件存在,打开它并删除旧的文件
ios::binary 打开一个二进制文件,缺省的是文本文件
上面是从C/C++的一些库里面找到的,下面再给出一些。
ios::in = 0x01, //供读,文件不存在则创建(ifstream默认的打开方式)
ios::out = 0x02, //供写,文件不存在则创建,若文件已存在则清空原内容(ofstream默认的打开方式)
ios::ate = 0x04, //文件打开时,指针在文件最后。可改变指针的位置,常和in、out联合使用
ios::app = 0x08, //供写,文件不存在则创建,若文件已存在则在原文件内容后写入新的内容,指针位置总在最后
ios::trunc = 0x10, //在读写前先将文件长度截断为0(默认)
ios::nocreate = 0x20, //文件不存在时产生错误,常和in或app联合使用
ios::noreplace = 0x40, //文件存在时产生错误,常和out联合使用
ios::binary = 0x80 //二进制格式文件
无论构造,还是open,后面都可以加模式选择。以构造器为例:
[cpp]
ofstream outfile("DATA.txt",ios::out|ios::trunc);
用了两种模式,要知道其实这两种模式就是两个8位数,通过“位或”可以把他们连起来用。
使用完毕,要关闭文件,outfile .close() 就可以了。
2、再说用ifstream把文件(辅存)里面的东西输入到程序(内存)里面吧。
下面是一个 DATA.txt 的文件内容:
[plain]
hello file!
Hi David!
写了三行。然后通过下面程序,就可以把这东西输出到屏幕:
[cpp]
int main()
{
string s;
ifstream infile("DATA.txt",ios::in);
if(!infile)return -1;
while(infile)
{
//istream& getline ( istream& is, string& str ); std里面的
getline(infile,s);//Get line from stream
cout<<s<<endl;
}
infile.close();
}
输出结果是:
[plain]
hello file!
Hi David!
请按任意键继续. . .
下面把DATA.txt改一下,解决我们文章一开始提到过的问题,不用命令行模式输入数据,用文本方式。下面是DATA.txt内容:
[plain]
12 33 44
22 463 93
63 48 9
好,下面写程序,把文件里面的东西传进数组里面。然后屏幕输出。
[cpp]
#include<iostream>
#include<fstream>
#include<iomanip> // 因为使用了setw()语句,设置位宽的。
using namespace std;
int main()
{
int num=3; //这个num自己也可以到控制台输入,程序现在不打算弄这个功能。
int **M=new int*[num]; //初始化行
ifstream infile("DATA.txt",ios::in);//初始化文件操作
if(!infile)return -1;//创建失败就返回错误
for(int i=0;i<num;i++)
{
M[i]=new int[num];//初始化列,到了这里已经成功初始化数组了
for(int j=0;j<3;j++)//这里开始给二维数组的每一个赋值
{
if(infile) infile>>M[i][j];//infile中读取数值,有空格就停,游标一直往下走下去
cout<<setw(5)<<M[i][j]; //设置位宽为5,输出到屏幕
}
cout<<endl; // 输出一行后换行
}
infile.close(); //关闭文件
}
输出结果:
[plain]
12 33 44
22 463 93
63 48 9
意键继续. . .
上面是一个格式化的输出哦~~位宽一定,为5,好看多了。这东西你可以再写进文件里面,哈哈~~
补充:软件开发 , C++ ,