C++:文件的输入和输出
1、共同的打开文件方式:
fin.open("test.txt",ios::binary)
fout.open("test.txt",ios::binary)
fboth.open("test.txt",ios::in|ios::out|ios::binary)
或者
fistream fin("test.txt",ios::binary)
fostream fout("test.txt",ios::binary)
fstream fboth("test.txt",ios::in|ios::out|ios::binary)
二进制文件的读写
第一种方式:使用函数get和put
1.例如 fout.put(ch)
fin.get(ch)
//练习1 将a到z的26个字符写到E:\\C++\\file2.txt中,并读取出来
#include<iostream>
#include<fstream>
using namespace std; //往文件写入数据
void filefout()
{
//ofstream fout("E:\\C++\\file2.txt",ios::binary);
ofstream fout;
fout.open("E:\\C++\\file2.txt",ios::binary);
if(!fout)
{
cout<<"the write file can not open";
exit();
}
char ch='a';
for(int i=;i<;i++)
{
fout.put(ch);
ch++;
}
fout.close();
} //从文件读取数据
void filefin()
{
ifstream fin;
fin.open("E:\\C++\\file2.txt",ios::binary);
if(!fin)
{
cout<<"the read file can not open";
exit();
}
char ch; while(fin.get(ch))
cout<<ch;
/*
while(!fin.eof())
{
fin.get(ch);
cout<<ch;
}
*/
fin.close();
cout<<endl;
} int main()
{
filefout();
filefin();
return ;
}
/*
abcdefghijklmnopqrstuvwxyz
*/
第二种方式:使用read函数和write函数
2.例如 fin.read(char*buf,int len)
fout.write(char*buf,int len)
练习2:将两门课程名和成绩以二进制的形式存储在E:\\C++\\file3.txt中,并读取出来
#include<iostream>
#include<fstream>
using namespace std;
struct list
{
char course[];
int score;
}; //往文件中写入数据
void filewrite()
{
list list[]={"Computer",,"Math",};
ofstream fout("E:\\C++\\file3.txt",ios::binary);
if(!fout)
{
cout<<"The write file can not open!\n";
abort();//exit(1)
}
for(int i=;i<;i++)
{
fout.write((char*)&list[i],sizeof(list[i]));
}
fout.close();
} //从文件读取数据
void fileread()
{
list list[];
ifstream fin("E:\\C++\\file3.txt",ios::binary);
if(!fin)
{
cout<<"The read file can not open!\n";
exit();
}
for(int i=;i<;i++)
{
fin.read((char*)&list,sizeof(list[i]));
cout<<list[i].course<<" "<<list[i].score<<endl;;
}
fin.close();
} int main()
{
filewrite();
fileread();
return ;
}
/*
Computer 90
Math 78
请按任意键继续. . .
*/
2、在头文件fstream.h中:
类名 说明 功能
ifstream 输入文件流类 用于文件的输入
ofstream 输出文件流类 用于文件的输出
fstream 输入输出流类 用于文件的输入/输出
建立流对象,例如
ifstream fin
ofstream fout
fstream fboth
打开文件方式有两种:
(1)使用成员函数open打开文件
文件流对象.open(文件名,打开模式)
例如:fin.open("test.txt",ios::in)===fin.open("test.txt")
fboth.open("test.txt",ios::in|ios::out|ios::binary)
打开模式例如:ios::in输入操作、ios::out输出操作、ios::binary二进制模式 输入输出模式一般会按流对象进行默认
(2)定义文件流对象时指定参数,通过调用文件流类的构造函数打开文件
例如:ofstream fout("test.txt").....
判断读写文件是否成功?
判断条件:文件打开失败,与文件相关联的流对象的值是0;否则是1.
例如:if(!fout)
{
cout<<"Cannot open file!\n ";
//return 1;
}
关闭文件:fout.close();
练习1:先建立一个输出文件,向它写入数据,然后关闭文件,在按输入模式打开它,并读取信息。
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
//往文件写入数据
ofstream fout("E:\\C++\\file1.txt");//ofstream fout("E:\\C++\\file1.txt","ios:out");
if(!fout) //如果文件打开失败,fout返回0
{
cout<<"Cannot open file!\n ";
return ;
}
fout<<"Hello world!\n"; //将一个字符串写到文件中
fout<<<<' '<<hex<<<<endl; //将一个十进制的100,分别以十进制格式和二进制格式写到文件中 fout.close(); //关闭写入流 //从文件读取数据
ifstream fin("E:\\C++\\file1.txt"); //ifstream fin("E:\\C++\\file1.txt","ios::in")
if(!fin) //如果文件打开失败,fin返回0
{
cout<<"Cannot open file!\n ";
return ;
}
char buffer[]; //定义一个存储数据的字符数粗缓冲区
while(!fin.eof())
{
fin.getline(buffer,); //一行一行读取数据
cout<<buffer<<endl;
}
/*
while(!fin.eof())
{
cout<<ch;
fin.get(ch);
}
*/
fin.close(); //关闭读取流 return ;
}
3、
(1). 检测文件结束EOF(end of file) 采用文件流方式读取方式时,使用成员函数eof(),可以检测这个结束符。
如果该函数的返回值非0,表示到达文件尾;返回值为0,表示未到达文件末尾。
例如: ifstream fin;
....
if(!fin.eof()) //尚未到达文件末尾
{
...
}
或者
ifstream fin;
....
if(!fin) //尚未到达文件末尾
{
...
}
或者
这种方式最常用:while(fin.get(ch))
cout.put(ch);//cout<<ch<<endl;
(2).二进制文件的随机读取
类istream提供了3个成员函数来对读指针进行操作:
tellg() //返回输入文件读指针的当前位置
seekg(文件中位置) //将输入文件中读指针移动指定的位置
seekg(位移量,参照位置) //以参照位置为基准,移动若干字节
文件中位置和位移量都是long型整数,以字节为单位,
参照位置 ios::beg //从文件开头计算要移动的字节数
ios::cur //从文件指针的当前位置计算要移动的字节数
ios::end //从文件末尾指针要移动的字节数
例如 fin.seekg(-/+50,ios::cur) //从文件指针当前位置向前/向后移动50个字节
类ostream提供了3个成员函数来对写指针进行操作:
tellp() //返回输出文件写指针的当前位置
seekp(文件的位置) //将输出文件中写指针移动到指定的位置
seekp(位移量,参照位置) //以参照位置为基准移动的若干字节
练习:随机访问二进制数据文件
有3门课程的数据,要求:
(1)以读写方式打开一个磁盘文件,并把这些数据存储到磁盘文件E:\\C++\\file4.txt;
(2)将文件指针定位到第3门课程,读取第3门课程的数据并显示出来;
(3)将文件指针定位到第1门课程,读取第1门课程的数据并显示出来;
#include<iostream>
#include<fstream>
using namespace std;
struct List
{
char course[];
int score;
};
int main()
{
List list[]={{"Computer",},{"Math",},{"Chinese",}};
List st;
fstream fboth;
fboth.open("E:\\C++\\file4.txt",ios::out|ios::in|ios::binary);
if(!fboth)
{
cout<<"The read-write file can not open!\n";
abort();
}
for(int i=;i<;i++)
{
fboth.write((char*)&list[i],sizeof(List));
}
//定位指针到第3门课程
fboth.seekg(sizeof(List)*);
fboth.read((char*)&st,sizeof(List));
cout<<st.course<<"\t"<<st.score<<endl; //定位指针到第1门课程
fboth.seekg(sizeof(List)*);
fboth.read((char*)&st,sizeof(List));
cout<<st.course<<"\t"<<st.score<<endl; //定位指针到下一门课程
fboth.seekg(sizeof(List)*,ios::cur);
fboth.read((char*)&st,sizeof(List));
cout<<st.course<<"\t"<<st.score<<endl; fboth.close(); return ;
}
(4)将文件指针定位从当前位置定位到下一门课程,读取该门课程的数据并显示出来;
C++:文件的输入和输出的更多相关文章
- 雷林鹏分享:C# 文件的输入与输出
C# 文件的输入与输出 一个 文件 是一个存储在磁盘中带有指定名称和目录路径的数据集合.当打开文件进行读写时,它变成一个 流. 从根本上说,流是通过通信路径传递的字节序列.有两个主要的流:输入流 和 ...
- 雷林鹏分享:Ruby 文件的输入与输出
Ruby 文件的输入与输出 Ruby 提供了一整套 I/O 相关的方法,在内核(Kernel)模块中实现.所有的 I/O 方法派生自 IO 类. 类 IO 提供了所有基础的方法,比如 read. wr ...
- 听翁恺老师mooc笔记(15)--文件的输入与输出
<>重定向 如果使用标准的printf输出,有一个比较简便的方法,可以将程序的结果写入一个文件.使用<和>符号,将程序运行结果重定向到文件中去,具体使用到的代码如下: ./te ...
- C++_IO与文件4-简单文件的输入与输出
通过键盘输入和屏幕输出被称为是控制台输入/输出: 更广义上讲控制台的输入/输出也是一种特殊的文件输入/输出: 当使用cin进行输入时,程序将输入视为一系列的字节,其中的每个字节都被解释成字符编码: 不 ...
- 【python】文件的输入和输出
1.os模块 2.os.path 模块 3.实例 1. os模块 对文件系统的访问大多通过python的os模块实现,其中os 模块负责大部分的文件系统操作,包括删除/重命名文件,遍历目录树,管理文件 ...
- Linux命令总结_文件的输入与 输出
1.echo命令 例子:echo string 解释:echo命令用于显示文本或变量,或者把字符串输入到文件,常用的几个特殊字符有以下几个 \c 不换行 \f 进纸 \t 调格 \n 换行 例子:ec ...
- Python 文件的输入与输出
1. 文本文件的读写主要通过open()所构建的文件对象来实现.我们打开一个文件,并使用一个对象来表示该文件 , f = open(d,r) 其中d是文件名,r是模式 "r" 文件 ...
- 【Python+Selenium】猪猪练习成功版:csv文件的输入和输出(运行环境:python3.5版本)
自己实践成功的从csv文件中读取用户名密码并实际登录系统后判断是否登录成功,并将已经运行的用户名密码及运行结果输出到一个新的csv文件中~ # coding=utf-8 from selenium i ...
- java之 ------ 文件的输入、输出(一)
import java.io.*; public class IntFile { private String filename; public IntFile(String filename) { ...
随机推荐
- java并发编程:进程和线程
java并发编程涉及到很多内容,当然也包括多线程,再次补充点相关概念 原文地址:http://www.cnblogs.com/dolphin0520/p/3910667.html 一.操作系统中为什么 ...
- 我教女朋友学编程html系列(7)—Html无序列表、自定义列表、有序列表及常用例子
昨天写的那篇文章<我教女朋友学编程Html系列(6)—Html常用表单控件>,基本上有1000人左右看了,那边文章是我站在前人的肩膀上修改来的,添加了截图和说明,合并了例子,使之更容易被初 ...
- android开发 替换bitmap中的颜色值
/** * 将bitmap中的某种颜色值替换成新的颜色 * @param bitmap * @param oldColor * @param newColor * @return */ public ...
- Windows窗体应用程序(非Console)使用libuv实现简单的异步WEB服务器
libuv是一个很强大的异步处理框架(严格意义上不能叫框架,其实就是一组异步函数库,当然框架这东西有各种各样的定义和理解_^...),最初的的目的是用于NODEJS的异步处理,不过因为它是一个独立的项 ...
- android编程常见问题- Resource ID #0x7f070001 type #0x12 is not valid
问题说明: AndroidRuntime(1705): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.e ...
- CentOS 6.5下Git服务器搭建
1 . Git服务器搭建 1. 环境部署 系统环境:服务器端:CentOS 6.5 ,ip:192.168.56.1 客户端:CentOS 6.5 ,ip:192.168.56.101 软件版本:服务 ...
- 【BZOJ】【1552】【Cerc2007】robotic sort / 【3506】【CQOI2014】排序机械臂
Splay 离散化+Splay维护序列…… 好吧主要说一下我做这道题遇到的几个错误点: 1.离散化 2.由于找到的这个数的位置一定是大于等于 i 的,所以其实在把它splay到根以后,i 结点只能sp ...
- 【POJ】【1637】Sightseeing tour
网络流/最大流 愚人节快乐XD 这题是给一个混合图(既有有向边又有无向边),让你判断是否有欧拉回路…… 我们知道如果一个[连通]图中每个节点都满足[入度=出度]那么就一定有欧拉回路…… 那么每条边都可 ...
- shader 汇编
mad ro.xy v1.xyxx, l(1.000000,-1.000000,0.0000,0.000000), l(0.000000,1.000000,0.0000,0.000000) 这个东西真 ...
- Codeforces Round #231 (Div2) 迟到的解题报告
题目A: 给一个火柴等式,可以从左边移动一根到右边,也可以从右边移到左边,但是不能移动“+”,”=“的火柴, 而且加法里面的数都要大于0(很重要的条件),基本上注意到这点的都过了,没注意的都被HACK ...