C++语言程序设计第五版 - 郑莉(第十一章课后习题)

第11章  流类库与输入输出

11-3 使用 I/O 流以文本方式建立一个文件 test1.txt,写入字符“已成功写入文件!”,用其他字处理程序(例如 Windows 的记事本程序 Notepad)打开,看看是否正确写入。

#include<iostream>
#include<fstream>
using namespace std;
 
int main()
{

	ofstream file1("test1.txt");
	file1<<"已成功写入文件!"<<endl;
	file1.close();
	return 0;
	
} 

11-4 使用 I/O 流以文本方式打开 11-3 题建立的文件 test1.txt,读出其内容并显示出来,看看是否正确。

#include<iostream>
#include<fstream>
using namespace std;

int main()
{
    char a[100];
    ifstream file2("test1.txt");
    if(!file2)
    {
        cout<<"fail to open";
        return 1;
    }
    file2.getline(a,100);
    cout<<a;
    file2.close();
    return 0;
} 

11-5 使用 I/O 流以文本方式打开 11-3 题建立的文件 test1.txt,在文件后面添加字符“已成功添加字符!”,然后读出整个文件的内容显示出来,看看是否正确。

#include<iostream>
#include<fstream>
using namespace std;
 
int main()
{
	ofstream file1("test1.txt",ios::app);   //在文件尾添加数据 
	file1<<"已成功添加字符!"<<endl;
	file1.close();
	
	char ch;
	ifstream file2("test1.txt");       //程序输出文件内容 
	while(file2.get(ch))
		cout<<ch;
	file2.close(); 
	
	return 0;
	
} 

11-6 定义一个 Dog 类,包含体重和年龄两个成员变量及相应的成员函数。声明一个实例 dog1,体重为 5,年龄为10,使用I/O 流把dog1 的状态写入磁盘文件。再声明另一个实例 dog2,通过读文件把 dog1 的状态赋给 dog2。分别使用文本方式和二进制方式操作文件,看看结果有何不同;再看看磁盘文件的ASCII码有何不同。

#include<iostream>
#include<fstream>
using namespace std;

class dog
{
public:
	dog(int weight, long days):itsWeight(weight),itsNumberDaysAlive(days){}
	~dog(){}

	int GetWeight()const { return itsWeight; }
	void SetWeight(int weight) { itsWeight = weight; }

	long GetDaysAlive()const { return itsNumberDaysAlive; }
	void SetDaysAlive(long days) { itsNumberDaysAlive = days; }

private:
	int itsWeight;
	long itsNumberDaysAlive;
};

int main() // returns 1 on error
{
	char fileName[80];

	cout << "Please enter the file name: ";
	cin >> fileName;
	//ofstream fout(fileName);
	ofstream fout(fileName,ios::binary);
	if (!fout)
	{
		cout << "Unable to open " << fileName << " for writing./n";
		return 1;
	}
	dog Dog1(5,10);
	fout.write((char*) &Dog1,sizeof Dog1);     //将对象Dog1的数据写入文件fileName 
	fout.close();

	//ifstream fin(fileName);
	ifstream fin(fileName,ios::binary);
	if (!fin)
	{
		cout << "Unable to open " << fileName << " for reading./n";
		return 1;
	}
	dog Dog2(2,2);
	cout << "Dog2 weight: " << Dog2.GetWeight() << endl;
	cout << "Dog2 days: " << Dog2.GetDaysAlive() << endl;


	fin.read((char*) &Dog2, sizeof Dog2);  //将对象Dog1的数据从文件fileName读出,随即将数据赋给对象Dog2 
	cout << "Dog2 weight: " << Dog2.GetWeight() << endl;
	cout << "Dog2 days: " << Dog2.GetDaysAlive() << endl;
	fin.close();
	
	return 0;
}	

11-9 编写程序实现如下功能:打开指定的一个文本文件,在每一行前加行号后将其输出到另一个文本文件中。

#include<iostream>
#include<fstream>
#include<cstdlib>
#include<iomanip> //函数setw() 输出格式控制
using namespace std;
 
int main(){
	/*(1)打开输入文件*/
	ifstream infile;
	infile.open("abc.txt");//outfile.open("abc.txt",ios::in); //默认方式,两种都可以 
	if(!infile){		   
		cout<<"输入文件abc.txt打开失败!\n";		   
		return 1;		   
	}
	  
	/*(2)打开输出文件*/
	ofstream outfile;
	outfile.open("abc_back.txt",ios::out);
	if(!outfile){
		cout<<"输出文件abc_back.txt打开失败!\n";
		return 1;
	}
	
	/*(3)复制行,并在行头添加行号*/
	int num_line=1;	//行号计数器
	char buffer[256]; //行拷贝缓冲区
	while(!infile.eof()){
		/*(3.1)读取1行,进行判断*/
		if (!infile.getline(buffer, sizeof(buffer))){
			//cout<<"已经到达文件结尾,文件读取失败,退出循环!";
			break;
		}
 
		/*(3.2)写出构造的新行*/
		while(infile.getline(buffer,256))
	    {
	    	outfile.width(10);     //设置域宽为10 
	        outfile << num_line++ << ". ";
	        outfile << buffer <<endl;    //将从abc.txt读入的内容写入abc_back.txt中 
	    }
	}
    
	/*(4)文件关闭*/
	infile.close();
	outfile.close();
 
	cout<<"操作成功,程序结束!\n";
	return 0; 
}

11-10 使用宽输入流从一个有中文字符的文本文件中读入所有字符,统计每个字符出现的次数,将统计结果用宽输出流输出到另一个文本文件中。

#include <iostream>
#include <fstream>
#include <string>
#include <locale.h>   
#include <map>
using namespace std;

int main()
{
	//locale loc(".936");
	//wcout.imbue(loc);
	puts(setlocale(LC_CTYPE, ""));    //设置中文编码方式
	wifstream in("习题11-10输入.txt");
	wofstream out("习题11-10输出.txt"); 
	//in.imbue(loc);
	//out.imbue(loc);
	wstring line;                //用来存储一行内容 
	map<wchar_t,int>counter;
	
	
	while(getline(in,line))
	{
		for(int i=0;i<line.length();++i)
		{
			counter[line[i]]++; 
		}
	}
	map<wchar_t,int>::iterator itor;
	int i=1;
	for(itor=counter.begin();itor!=counter.end();++itor,++i)  //迭代器
	{
		out<<itor->first<<"\t"<<itor->second<<"\t";
		if(i%4==0){
			out<<endl;
		}
	}
	in.close();
	out.close(); 
	
	return 0;
}

参考文章:2022-04-14 在TXT文档中查找汉字——C语言及C++中多字节与宽字符的区别_不停感叹的老林的博客-CSDN博客_提取txt中的汉字汉字是什么类型汉字是char类型么,显然不是,在C或C++的语境里,char的值一般都在0-255之间,显然,汉字远远超过了这个区间。但我们赋值的时候还是用char数组或string来赋值,也一样可以输出汉字,当然输入就是另外一回事了。当你可以用char来输出汉字,意味着你在用多字节模拟宽字符,比如汉字 “我” ,在utf8编辑环境中,它的strlen是3,也就是要用3个char才能表示一个汉字。这在普通的文本输出时没有问题,但是涉及到文本编辑时候,那就是大问题了。你如何查找修改汉字?在C或C++https://blog.csdn.net/m0_54206076/article/details/124139805?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165555686216781483775668%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165555686216781483775668&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-124139805-null-null.142%5Ev17%5Econtrol,157%5Ev15%5Enew_3&utm_term=C%2B%2B%E4%BD%BF%E7%94%A8%E5%AE%BD%E8%BE%93%E5%85%A5%E6%B5%81%E4%BB%8E%E4%B8%80%E4%B8%AA%E6%9C%89%E4%B8%AD%E6%96%87%E5%AD%97%E7%AC%A6%E7%9A%84%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E8%AF%BB%E5%85%A5%E6%89%80%E6%9C%89%E5%AD%97%E7%AC%A6%EF%BC%8C%E7%BB%9F%E8%AE%A1%E6%AF%8F%E4%B8%AA%E5%AD%97%E7%AC%A6%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0%EF%BC%8C%E5%B0%86%E7%BB%9F%E8%AE%A1%E7%BB%93%E6%9E%9C%E7%94%A8%E5%AE%BD%E8%BE%93%E5%87%BA%E6%B5%81%E8%BE%93%E5%87%BA%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E3%80%82&spm=1018.2226.3001.4187

【C++学习笔记】C++文件操作_小熊coder的博客-CSDN博客_c++接收文件文章目录计算机文件到底是什么(通俗易懂)?C++文件类(文件流类)及用法详解C++ open 打开文件(含打开模式一览表)使用 open 函数打开文件使用流类的构造函数打开文件文本打开方式和二进制打开方式的区别是什么?文本文件和二进制文件的区别两种打开方式的区别C++ close()关闭文件方法详解C++打开的文件一定要用close()方法关闭!C++ flush()刷新缓冲区C++文本文件读写操作详解C++ >>和<<读写文本文件C++ read()和write()读写二进制文件(https://blog.csdn.net/qq_41854911/article/details/119392958?ops_request_misc=&request_id=&biz_id=102&utm_term=C++%E7%BC%96%E5%86%99%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%8E%B0%E4%BB%A5%E4%B8%8B%E5%8A%9F%E8%83%BD%EF%BC%9A%E6%89%93%E5%BC%80%E6%8C%87%E5%AE%9A%E7%9A%84%E4%B8%80%E4%B8%AA%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%EF%BC%8C%E5%9C%A8%E6%AF%8F%E4%B8%80%E8%A1%8C&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-119392958.142%5Ev17%5Econtrol,157%5Ev15%5Enew_3&spm=1018.2226.3001.4187

本专栏为本人大二C++课程的习题作业和一些学习经验的分享,供大家参考学习。如有侵权请立即与我联系,我将及时处理。


参考书籍为:C++语言程序设计 第五版 -清华大学出版社- 郑莉,董渊、C++语言程序设计 第五版 -清华大学出版社- 郑莉,董渊(学生用书)

编译环境:Visual Studio 2019、Dev-C++

欢迎关注我的微信公众号,分享一些有趣的知识:程序猿的茶水间

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值