使用文件输出的主要步骤如下:
1.包含头文件fstream 。
2.创建一个ofstream 对象。
3.将该ofstream 对象同一个文件关联起来。
4.就像使用cout 那样使用该ofstrcam 对象。
#include
#include
using namespace std;
int main() {
//调用ofstream类创建myout对象
ofstream myout("C:/Users/Administrator/Desktop/test/test.txt", ios::in | ios::out | ios::app);
/*ofstream myout("test.txt");*/ //这样是默认生成在当前程序文件夹内
//打开文件后可以执行写入操作
for (int i = 1; i <= 5; i++) {
myout << "number: " << i << endl;
}
/*is_open检测文件是否被程序打开*/
if (myout.is_open()) {
myout << "is opened,out from myout" << endl;
/*在屏幕上输入,输出到文件*/
string Char;
cin >> Char;
myout << "从键盘输入并存到文件的是: " << Char << endl;
}
myout.close();
//在这之前已经执行close(),下面这行不能输入到文本。如果想写入就需要重新打开文本。myout.open()
myout << "cant out" << endl;
cout << "over" << endl;
return 0;
}
(1)open()
上面对象myout使用的open()方法,默认情况下,open()将首先截断该文件即将其长度截短到零——丢其原有的内容,然后将新的输出加入到该文件中:
ofstream myout;
myout.open("C:/Users/Administrator/Desktop/test/test.txt");
(2)想要自定义打开文本的方式,可以添加:
- ios::in 为输入(读)而打开文件
- ios::out 为输出(写)而打开文件
- ios::ate 初始位置:文件尾
- ios::app 所有输出附加在文件末尾
- ios::trunc 如果文件已存在则先删除该文件
- ios::binary 二进制方式
例如:
myout.open("C:/Users/Administrator/Desktop/test/test.txt", ios::in | ios::out | ios::app); //以读写,并把输出附加在文件末尾的方式打开文本文件。
(3)close()
当文件读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问的。成员函数close(),它负责将缓存中的数据排放出来并关闭文件。这个函数一旦被调用,原先的流对象就可以被用来打开其它的文件了,这个文件也就可以重新被其它的进程所访问了。
如果忘记关闭文件,程序正常终止时将自动关闭它。方法close()不需要使用文件名作为参数,这是因为对象myout 已经同特定的文件关联起来。为防止流对象被销毁时还联系着打开的文件,析构函数将会自动调用关闭函数close。
使用文件读取的主要步骤如下:
1.包含头文件fstream 。
2.创建一个ifstream 对象。
3.将该ifstream 对象同一个文件关联起来。
4.就像使用cin 那样使用该ifstrcam 对象。
/*C++primer plus 6.16sumafile*/
#include
#include // file I/O support
#include // support for exit()
#include
#include
const int SIZE = 60;
int main() {
using namespace std;
ofstream myout("C:/Users/Administrator/Desktop/test/test.txt", ios::in | ios::out | ios::app);
int number[10] = { 0 };
srand((unsigned)time(NULL)); //播种子
for (int i = 0; i < 10; i++) {
number[i] = rand() % 100; //产生100以内的随机整数,不包括100。
//number[i] = rand() % (200 - 100 + 1) + 100; //int num=rand()%(n-m+1)+m 产生 [m,n] 范围内的随机数 num
myout << number[i] <<" ";
}
myout.close();
char filename[SIZE];
ifstream inFile; // 创建处理文件输入的对象
cout << "Enter name of data file: ";
cin.getline(filename, SIZE);
string File = "C:/Users/Administrator/Desktop/test/"; //为了方便,我在这里定了一个文件夹
File = File + filename;
inFile.open(File); // 将inFile与文件关联
if (!inFile.is_open()) // 打开文件失败
{
cout << "Could not open the file " << filename << endl;
cout << "Program terminating.\n";
// cin.get(); // keep window open
exit(EXIT_FAILURE); //函数exit()的原型是在头文件cstdlib中定义的,在该头文件中,还定义了一个用于同操作系统通信的参数值EXIT_FAILURE。函数exit()终止程序。
}
double value;
double sum = 0.0;
int count = 0; // 累计项目数
inFile >> value; // 读取第一个值
while (inFile.good()) // 较老的方法good(),或者使用!eof()
//while(inFile>>value) //如果用这行替换上面两行,会导致只能读取到第一个回车符号后就结束读取。使用方法读取能获取到文件末尾。
{
++count; // one more item read
sum += value; // 累加所有值
inFile >> value; // 获取下一个值
}
if (inFile.eof()) //读取到文件末尾
cout << "End of file reached.\n";
else if (inFile.fail()) //读取格式错误。例如读取到一个不符合上面double类型的字符,返回true
cout << "Input terminated by data mismatch.\n";
else
cout << "Input terminated for unknown reason.\n";
if (count == 0) //如果没有符合的数据类型
cout << "No data processed.\n";
else {
cout << "Items read: " << count << endl;
cout << "Sum: " << sum << endl;
cout << "Average: " << sum / count << endl;
}
inFile.close(); // 关闭文件
//cin.get();
return 0;
}
(1)警告:
Windows 文本文件的每行都以回车字符和换行符结尾;通常情况下,C++在读取文件时将这两个字符转换为换行符,并在写入文件时执行相反的转换。有些文本编辑器(如Metrowerks CodeWarrior IDE编辑器),不会自动在最后一行末尾加上换行符。因此,如果使用的是这种编辑器,请在输入最后的文本后桉下回车键,然后再保存文件。
Windows自带的记事本就不会在末尾加上换行符。这里可坑了我半天。
(2)生产10个随机整数数写入文本
ofstream myout("C:/Users/Administrator/Desktop/test/test.txt", ios::in | ios::out | ios::app);
int number[10] = { 0 };
srand((unsigned)time(NULL)); //播种子
for (int i = 0; i < 10; i++) {
number[i] = rand() % 100; //产生100以内的随机整数,不包括100。
//number[i] = rand() % (200 - 100 + 1) + 100; //int num=rand()%(n-m+1)+m 产生 [m,n] 范围内的随机数 num
myout << number[i] <<" ";
}
myout.close();
(3)该程序没有使用硬编码文件名,而是将用户提供的文件名存储到字符数组filename 中,然后将该数组用作open( )的参数:
inFile.open(File);
(5)如果想要读取文件内容打印到屏幕上,用下面代码可以实现:
/*读取文件的内容打印到屏幕上*/
ifstream ifstream_in;
ifstream_in.open("C:/Users/Administrator/Desktop/test/test.txt");
//声明自己的ifstream 对象,为其命名,并将其同文件关联起来。
if (!ifstream_in.is_open()) { //如果文件被成功地打开,方法is_open()将返回true。这里是打开文件失败。
cout << "Error opening file";
exit(1);
}
while (!ifstream_in.eof()) {
char buffer[100];
ifstream_in.getline(buffer, 100); //读取文本的每行,将其打印到屏幕上。超过100字符不能打印
cout << buffer << endl;
}
ifstream_in.close();
其中有很多方法没弄明白:exit(), good(), eof(), fail()......