getline()
有时候我们希望在最终的字符串中保留输入时的空白符,这时候应该用getline函数来替代原来的>>运算符。( cin 不能输入包含嵌入空格的字符串)。
getline()函数的参数是一个输入流和一个string对象,原型是:getline(cin,string对象),函数从给定的输入流中读入内容,直到遇到换行符为止,但是此时的换行符要被读入,然后把所读入的内容存到string对象中,但此时不存入最后那个换行符。
getline函数的参数是一个输入流和一个string对象函数从给定的输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入到那个string对象中去(注意不存换行符)。
注意:getline只要一遇到换行符就结束读取操作并返回结果,哪怕输入的一开始就是换行符也是如此。如果输入真的一开始就是换行符,那么所得结果也是一个空string。
在<string>
中的getline
函数有四种重载形式:
istream& getline (istream& is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
istream& getline (istream& is, string& str);
istream& getline (istream&& is, string& str);
读取的istream是作为参数is传进函数的,读取的字符串保存在string类型的str中。
函数的变量:
- is :表示一个输入流,例如 cin。
- str :string类型的引用,用来存储输入流中的流信息。
- delim :char类型的变量,所设置的截断字符;在不自定义设置的情况下,遇到’\n’,则终止输入。
getline只要遇到换行符就停止读入并且返回string对象,哪怕一开始输入就是换行符也是如此,只不过会返回一个空的string对象。和输入运算符一样,getline也会返回它的流参数,所以可以用getline的结果作为条件。
C++文件操作
程序运行时,产生的数据都属于临时数据,程序一旦运行结束都会被释放,通过文件可以将数据持久化,C++对文件操作需要包含头文件 < f s t r e a m > 。文本类型分为两种:
(1)文本文件:文件以文本的ASCII码的形式存储在计算机中。
(2)二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂他们。
操作文件三大类:
- ofstream:写
- ifstream:读
- fstream:读写
文本文件
写文件
步骤如下:
- 包含头文件:#include< fstream>
- 创建流对象:ofstream ofs;
- 打开文件:ofs.open(“文件路径”,打开方式);
- 写数据:ofs<<“写入的数据”;
- 关闭文件:ofs.close();
打开方式:
注:文件打开方式可以配合使用,利用|操作符。
void Csv::WriteCsvFile() {
//std::ofstream out_file("data.csv", std::ios::out); //std::ios::out 文件不存在则创建文件,有文件则清空文件
std::ofstream out_file;
out_file.open("data.csv", std::ios::out);
if (!out_file) {
std::cout << "open file failed" << std::endl;
return;
}
for(int i = 0; i < 5; ++i) {
out_file << 12 << ",";
out_file << 13 << ",";
out_file << 14 << std::endl;
}
out_file.close();
std::cout << "write file successed" << std::endl;
}
读文件
步骤如下:
- 包含头文件:#include< fstream>
- 创建流对象:ifstream ifs;
- 打开文件,并判断文件是否打开成功:ifs.open(“文件路径”,打开方式);
- 读数据:四种读取方式
- 关闭文件:ifs.close();
void Csv::ReadCsvFile() {
//std::ifstream in_file("data.csv", std::ios::in);
std::ifstream in_file;
in_file.open("data.csv", std::ios::in);
if (!in_file) {
std::cout << "open fill failed" << std::endl;
}
int num = 0;
std::string line;
std::string file;
while (std::getline(in_file, line)) {
std::string file;
// 将整行字符串line读入到字符串流iss中
std::istringstream iss(line);
//将字符串流sin中的字符读入到field字符串中,以逗号为分隔符
std::getline(iss, file, ',');
//将刚刚读取的字符串转换成int
std::cout << std::atoi(file.c_str()) << " ";
std::getline(iss, file, ',');
std::cout << std::atoi(file.c_str()) << " ";
std::getline(iss, file, ',');
std::cout << std::atoi(file.c_str()) << std::endl;
num++;
}
std::cout << "读取了" << num << "行" << std::endl;
if (5 == num) {
std::cout << "read file success" << std::endl;
}
in_file.close();
}
二进制文件
以二进制的方式对文件进行读写,打开方式要指定为ios::binarry。
写文件
二进制方式写文件主要利用流对象调用成员函数write。函数原型:ostream& write(const char buffer,int len)。参数解释:字符指针buffer指向内存中的一段存储空间,len是读写的字节数。*
读文件
**二进制方式读文件主要利用流对象调用成员函数read。函数原型:istream & read(char *buffer, int len);参数解释:字符指针buffer指向内存中一段存储空间,len是读书的字节数。 **