ca75a_c++_标准IO库-利用流对象把文件内容读取到向量-操作文件

C++ 专栏收录该内容
186 篇文章 5 订阅

/*ca75a_c++_标准IO库习题练习
习题8.3,8.4,8.6
习题8.9、8.10

ifstream inFile(fileName.c_str());
1>d:\users\txwtech\projects\ca75a\ca75a\ca75a.cpp(28): error C2079: “inFile”使用未定义的 class“std::basic_ifstream<char,std::char_traits<char>>”
1>d:\users\txwtech\projects\ca75a\ca75a\ca75a.cpp(28): error C2440: “初始化”: 无法从“const _Elem *”转换为“int”

//未包含#include <fstream>。

调用的函数参数,能够接收基类(istream)的地方,都能够接受子类(ifstream)
参考:
https://blog.csdn.net/txwtech/article/details/104251103

std::istream& get(std::istream &in)//8.3
get函数也可以接收ifstream
*/

while (getline(inFile, s))//一次读取一行,放在s里面

 while(inFile>>s) //>>流输入操作符,一个一个的单词读取,空格作为单词分割的标志

inFile是流对象,inFile绑定了一个文件,把文件内容传递个s

/*ca75a_c++_标准IO库习题练习
习题8.3,8.4,8.6
习题8.9、8.10

ifstream inFile(fileName.c_str());
1>d:\users\txwtech\projects\ca75a\ca75a\ca75a.cpp(28): error C2079: “inFile”使用未定义的 class“std::basic_ifstream<char,std::char_traits<char>>”
1>d:\users\txwtech\projects\ca75a\ca75a\ca75a.cpp(28): error C2440: “初始化”: 无法从“const _Elem *”转换为“int”

//未包含#include <fstream>。

调用的函数参数,能够接收基类(istream)的地方,都能够接受子类(ifstream)
参考:
https://blog.csdn.net/txwtech/article/details/104251103

std::istream& get(std::istream &in)//8.3
get函数也可以接收ifstream
*/
#include <iostream>
#include <string>
//#include <istream>
#include <fstream>
using namespace std;

#include "get.h"

int main()
{

	cout << "测试新写的函数,请输入数字,或者字母" << endl; //8.4
	double dval; 
	get(cin); //输入什么内容,显示什么内容。输入错误可以有提示
	
	cout << "继续使用cin,输入一个double: " << endl;
	cin >> dval;
	cout << "您输入的是: " << dval << endl;

	cout << "习题8.6" << endl;

	string fileName;
	//fileName="aa.txt";
	cout << "Enter file name请输入一个文件名:test.txt " << endl;
	cin >> fileName;
	ifstream inFile(fileName.c_str()); //绑定输入的文件
	if (!inFile)
	{
		cerr << "error:can not open input file" << fileName << endl;
		return -1;
	}
	get(inFile);

	


	return 0;
}

get.cpp

#include "get.h"

std::istream& get(std::istream &in)//8.3
{
	int ival;
	while (in >> ival, !in.eof())//让in.eof()决定是否结束,ctrl+z结束输入
	{
		if (in.bad())//巨大错误
			throw std::runtime_error("IO stream error");
		if (in.fail())//判断输入类型是否相同
		{
			std::cerr << "bad data,try again." << std::endl; //std名称空间
			in.clear();//恢复流到正常状态
			in.ignore(200,'\n');//
			continue;
		}
		std::cout << "输入的数据: " << ival << std::endl;
	}
	in.clear();//恢复流到正常状态
}

get.h

//#pragma once
#ifndef _GET_H
#define _GET_H

//头文件不要用using namesapce std;
#include <iostream>
std::istream& get(std::istream &in);


#endif

 

利用流对象把文件内容读取到向量并显示。

/*ca75b_c++_txwtech

*/

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;
//文件名的内容放在向量里面

int fileToVector(string fileName, vector<string> & svec) //习题8.9,一次读取一行
{
	ifstream inFile(fileName.c_str());//打开fileName的文件
	if (!inFile)
		return 1;
	string s;
	while (getline(inFile, s))//一次读取一行,放在s里面
		svec.push_back(s);//s字符串又放在vector向量里面
	inFile.close();//关闭流对象
	if (inFile.eof())//读取到文件末尾
		return 4;//正常返回
	if (inFile.bad())
		return 2;//系统重大故障
	if (inFile.fail())
		return 3;//输入字符串,但收入的数字之类的错误。

}
int fileToVector1(string fileName, vector<string> & svec) //习题8.10,一次输入一个单词
{
	ifstream inFile(fileName.c_str());//打开fileName的文件
	if (!inFile)
		return 1;
	string s;
	//while (getline(inFile, s))//一次读取一行,放在s里面
	  while(inFile>>s) //>>流输入操作符,一个一个的单词读取,空格作为单词分割的标志
		svec.push_back(s);//s字符串又放在vector向量里面
	inFile.close();//关闭流对象
	if (inFile.eof())//读取到文件末尾
		return 4;//正常返回
	if (inFile.bad())
		return 2;//系统重大故障
	if (inFile.fail())
		return 3;//输入字符串,但收入的数字之类的错误。

}

int main() //8.9
{
	vector<string> svec;
	string fileName, s;
	cout << "输入文件名: " << endl;
	cin >> fileName;

	//switch (fileToVector(fileName, svec)) //调用读取一行
	switch (fileToVector1(fileName, svec)) //读取单词一个一个读取
	{
	case 1:
		cout << "error:can not open file: " << fileName << endl;
		//break;
		return -1;
	case 2:
		cout << "系统出错了" << endl;
		return -1;
	case 3:
		cout << "输入数据类型不匹配的错误。" << endl;
		return -1;
	}
	cout << "向量的内容: " << endl;
	for (vector<string>::iterator iter = svec.begin(); iter != svec.end(); ++iter)
		cout << *iter << endl;
	//cout << "文件名有多少行呢》:" << svec.size() << endl;
	cout << "文件有多少个单词呢:" << svec.size() << endl;



	return 0;

}

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值