当前位置:编程学习 > C/C++ >>

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++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,