文本文件(ASCII)的读写

来源:互联网 发布:可以打电话的软件 编辑:程序博客网 时间:2024/06/11 00:21

文本文件:字符以ASCII形式存储。

1. 打开磁盘文件

打开文件 为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件,同时也指定文件的工作方式。文件流是内存中的,也就是为内存与磁盘中的文件建立联系。

打开文件的两种不同方法:

(1)调用文件流的成员函数open,比如:

ofstream outfile;//定义输出文件流类对象

outfile.open("f1.dat",ios::out)//ios::out定义了打开文件的方式,这里是输出方式,所以打开的是输出文件.这里的文件名用的是相对路径,相对于当前程序所在文件的路径

(2)在定义文件流对象时调用文件流类的构造函数

istream infile("c:\\new\\f1.dat",ios::in)//这里的文件名用的是绝对路径,




这些方式都是在ios命名空间中定义的。

读 指数据从文件中读到内存中;

写 数据写到文件中。

文件指针:标识当前读写文件从哪里读写,标识位置。

ate可读可写。app和out不同。app更安全。nocreate不允许重新建立文件;noreplace操作文件时必须为新文件,对于已有文件不能进行替换;打开文件时默认为文本文件。

比如:

fstream f("d:\\dat\\score.dat",ios::in|ios::our|ios::binary)//以读写方式打开二进制文件,比较常用的方式


打开操作失败时:

1. 打开文件失败,open函数的返回值为0。

因此常用的处理方式如下:

if(outfile.open("f.dat",ios::app)

{
cerr<<"open error";

exit(1);//#include <cstdlib>.

}

或者

if(outfile.open("f.dat",ios::app)==0)

cerr<<"open err";

else

.......

或者

if(outfile.open("f.dat",ios::app))

{

//打开成功的操作

}



exit功 能: 关闭所有文件,终止正在执行的进程。

exit(1)表示异常退出.这个1是返回给操作系统的。

exit(x)(x不为0)都表示异常退出

exit(0)表示正常退出

exit()的参数会被传递给一些操作系统,包括UNIX,Linux,和MS DOS,以供其他程序使用。

stdlib.h: void exit(int status);

参 数 : status //程序退出的返回值

exit()和return的区别:

按照ANSI C,在最初调用的main()中使用return和exit()的效果相同。

但要注意这里所说的是"最初调用"。如果main()在一个递归程序中,exit()仍然会终止程序;但return将

控制权移交给递归的前一级,直到最初的那一级,此时return才会终止程序。return和exit()的另一个区别

在于,即使在除main()之外的函数中调用exit(),它也将终止程序。

_exit()与exit的区别:

头文件:

exit:#include<stdlib.h>

_exit:#include<unistd.h>

_exit()函数:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;

exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。

exit()函数与_exit()函数最大的区别就在于 exit()函数在调用 exit 系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件

2. 如果是调用构造函数的方式打开文件时 ,打开失败,则流对象的值为0:

ofstream outfile("f.dat",ios::out);

if(!outfile)

{

cerr<<"open error"<<endl;

exit(1);

}

2. 关闭文件:流对象调用成员函数.close

关闭文件将缓冲区中的数据妥善处理(缓冲区中有数据没有保存到磁盘,会自动保存到磁盘文件中),解除了磁盘文件与文件流的关联,不再通过文件流对文件进行输入或者输出。



将数据写入到ASCII文件中:

#include <iostream>

#include<fstream>

#include<stdlib>//通常是为了exit

using namespace std;

int main()

{

int a[10];
//打开文件

ofstream outfile("f.dat",ios::out);

if(!outfile)//这里的判断一定更要注意!!!!

{

cerr<<"open error";

exit(1);

}

//操作文件

cout<<"enter 10 integers:"<<endl;

for(int i=0;i<10;i++)

{
cin>>a[i];

outfile<<a[i]<<" ";

}

//关闭文件

outfile.close();

return 0;

}


从ASCII文件读入数据;

将上面写入到f.dat文件中的数据读入,并找出输出10个数中最大者和它的序号

#include <iostream>


#include <fstream>


#include<cstdlib>


using namespace std;


int
main ()


{
  int a[10], max, order;


  //打开文件



  ifstream infile ("f.dat", ios::in);


  if (!infile)


    {


      cerr << "open error" << endl;


      exit (1);


    }


  //操作文件



  for (int i = 0; i < 10; i++)


    {
      infile >> a[i];


      cout << a[i] << " ";


    }


  cout << endl;


  //关闭文件



  infile.close ();


  //其他工作


  max = a[0];


  order = 0;
  for (int i = 0; i < 10; i++)
    {
      if (a[i] > max)


{
 max = a[i];


 order = i;


}
    }


  cout << "max=" << max << endl;


  cout << "order=" << order << endl;


  return 0;


}


ASCII文件:文件中的每一个字节均已ASCII代码形式存放,即一个字节存放一个字符。

对ASCII文件的读写操作方法:

(1)用流插入运算符<<和流提取运算符>>输入输出标准类型的数据

infile>>a[i]   cin<<a[i]  cin是系统自动定义的对象,infile是我们自己定义的;

outfile<<a[i]  cout<<a[i]

(2)用文件流的put  get  getlin 等成员函数进行字符的输入输出


需要注意的是, 创建并打开一个文件流后,就能像操作标准I/O那样使用流插入操作符(<<)与流提取操作符(>>)。对于输入文件流来说,使用提取操作符时会自动跳过空白字符,如果二进制文件中刚好有某个字节的值与这六种空白字符的ASCII码相同,则会造成问题,如我开篇所讲那样。尤其当文件较大时,遇到空白字符(只是值与空白字符的ASCII码相同,并不是起控制作用的)的概率将大大增加。


下面的程序是将从键盘读入一行字符,把其中的小写字母字符一次存放在磁盘文件f2.dat中,再把它从磁盘文件读出程序,将其中的小写字母改成大写字母,再存入磁盘文件:

#include<iostream>
      #include <fstream>

#include<cstdlib>

using namespace std;


int
main ()
{
  char a[10];
  cin.getline (a, 10);
  ofstream outfile ("f2.dat", ios::out);
  if (!outfile)
    {
      cerr << "open err" << endl;
      exit (1);
    }
  for (int i = 0; a[i] != 0; i++) //0就是'\0'
    {
      if (a[i] >= 'a' && a[i] <= 'z')
outfile.put (a[i]);
    }
  outfile.close ();

//下面做的其实是文件的复制,原来文件中有什么读出来然后写到另一个文件中,这是经常用到的
  ifstream infile ("f2.dat", ios::in);
  if (!infile)
    {
      cerr << "open err" << endl;
      exit (1);
    }


  ofstream outfile1 ("f3.dat", ios::out);
  if (!outfile1)
    {
      cerr << "open err";
      exit (1);
    }
  char ch;
  while (infile.get (ch))
    {
      outfile1.put (ch - 32);
    }
  infile.close ();
  outfile1.close ();
  return 0;
}


示例:在显示器上输出文件

文件名可以作为参数放到函数中:

#include <iostream>


#include <fstream>


#include<cstdlib>


using namespace std;


void display_file(char *filename);
int main()
{
  display_file("file3.dat");
  return 0;
}


void display_file(char *filename)
{
  ifstream infile(filename,ios::in);
  if(!infile)
    {
      cerr<<"open err";
      exit(1);
    }
  char ch;
  while(infile.get(ch))
    {
      cout.put(ch);
    }
  cout<<endl;
  infile.close();
}

原创粉丝点击