C++流操作
C++流的使用(续)
文件I/O
常用的基本方法是 open()
,c_str()
,is_open()
分别时连接文件,转为C风格字符串,是否连接文件成功
#include `<fstream>` //此头文件已经包含了iostream
...
string cppstr1 = "input.txt", cppstr2 = "output.txt";
...
ifstream fin; //任意命名
ofstream fout;
fin.open(cppstr1.`c_str()`);
if(!fin.`is_open()`)
{
cerr << "...";
return -1;
}
fout.open();
...
使用命令行参数的使用
int main(int argc, char* argv[])
式中的参数很多人既熟悉又陌生,第一个参数代表参数个数(包括自身)
第二个参数argv的意义在于使用某个参数的名字,以字符串的形式,举个栗子
#include ...
//...
int main(int argc, char* argv[])
{
for(int file = 1;file < argc;++file) //file为 0 时输出的是该命令或者可执行文件的名称
cout << argv[file]; //argv[file]的类型为char*, 即为一个字符串,内容
//为参数的名字,argc代表总参数个数+1
}
假设上面的程序经过编译,在Liunx下实验则为(Windows下请打开命令提示符模式(Win+R,输入cmd,回车后打开),后续操作相同)
~$ a.out file1 file2
其中 argv[1] == "file1", argv[2] == "file2" argv[0] == "a.out"
文件I/O的模式 mode
//接上上个程序
fin.open(cppstr1.c_str()
,mode);//mode代表模式,后面介绍
ifstream fin2(cppstr2.c_str()
,mode);//也可以使用构造函数的方式
ofstream fout2(...);//ofstream的模式多于ifstream
下面模式可以与C中的I/O模式对应
ios_base::in
//此mode适用于ifstream类型,用于打开并读取文件
ios_base::out
//打开文件,并写入
ios_base::trunc
//如果文件存在则,截断文件,ofstream的构造函数默认使用 ios_base::out|ios_base::turnc
ios_base::app
//打开文件,追加到文件尾写入
ios_base::ate
//打开文件,并移动到文件尾
ios_base::binary
//使用二进制文件模式.对于数字十分迅捷,但也有不足,即兼容性.
符号|
,代表或,该运算符两端的操作都使用
文件I/O之二进制文件
此后的代码都必须建立在同一种类型的系统甚至同一种类型的编译器中,即产生或使用的文件的使用的范围.
#include `<fstream>`
const char* filename = "test.txt";
struct test{
char name[10];
double popu;
double g;
};//定义一个结构体,用来展示二进制的读以及写
int main(){
...//创建一个test类型的结构体对象,并填入值,对象名为 bintest
ofstream fout(filename, `ios_base::in`|`ios_base::binary`);
...//检查是否打开成功
fout.write((`char*`)&bintest, sizeof bintest);
`//使用write函数来写入,char*代表逐个字符的从内存写入到文件,而不考虑存储类型`
ofstream fin(filename, `ios_base::in`|`ios_base::binary`);
...//检查是否打开成功
fin.read((char*)&bintest, sizeof bintest);//使用read函数来恢复使用write函数写入的二进制数据
...//验证是否操作有误
return 0;
}
科普:由于三大类操作系统对于换行有不同定义,导致了第一句话:
Windows使用换行加回车表示 换行符
Unix/Liunx使用换行来表示 换行符
Macintosh使用回车来表示 换行符(即苹果电脑)