文本文件(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();
}
- 文本文件(ASCII)的读写
- c:文本文件的读写(simple版)
- 文本文件的读写
- Java 文本文件的读写
- 文本文件的读写
- 文本文件读写的方法
- 文本文件的读写
- 文本文件的读写
- C++文本文件的读写
- C++文本文件的读写
- 文本文件的读写
- 流:文本文件的读写
- 文本文件的读写
- A07_文本文件的读写
- 读写文本文件(C#)
- GrADS学习笔记之一:读写ASCII文本文件+自定义函数
- 文本文件的读写和二进制文件的读写
- 简单的c#文本文件读写
- postgre的数组使用
- 卷积神经网络传播过程中感受野的理解以及feature map size 、receptive field size的计算(代码)
- AndroidStudio 线程
- django-rest-swagger的优化使用
- Android面试总结
- 文本文件(ASCII)的读写
- iOS开发之深复制和浅复制
- ImageEditor库详解—————StickerView详解
- 深入理解事务--事务ACID特性及隔离级别
- Gitlab不更新Activity的解决方案
- Valgrind用户手册
- 【bzoj4390】[Usaco2015 dec]Max Flow
- 基于vue2框架的机器人自动回复mini-project
- C语言实现个人所得税计算