gol*_*ean 12 c++ operators ifstream
根据我的学习,我正在尝试使用c ++ ifstream及其operator >>使用下面的代码从文本文件中读取数据.文本文件outdummy.txt具有以下内容:
just dummy
Hello ofstream
555
Run Code Online (Sandbox Code Playgroud)
我的问题是如何将文件中存在的char数据读入char数组或字符串.如何在下面的代码中使用ifstream :: operator >>来完成此操作.
#include <iostream>
#include <fstream>
int main()
{
int a;
string s;
char buf[100];
ifstream in("outdummy.txt",ios_base::in);
in.operator>>(a); //How to read integer? How to read the string data.??
cout << a;
in.close();
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Ker*_* SB 16
如果要使用格式化输入,则必须事先知道要预期的数据,并将其读入相应数据类型的变量.例如,如果您知道该数字始终是第五个标记,则在您的示例中,您可以执行以下操作:
std::string s1, s2, s3, s4;
int n;
std::ifstream in("outdummy.txt");
if (in >> s1 >> s2 >> s3 >> s4 >> n)
{
std::cout << "We read the number " << n << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
另一方面,如果你知道这个数字总是在第三行,那么它本身就是:
std::string line;
std::getline(in, line); // have line 1
std::getline(in, line); // have line 2
std::getline(in, line); // have line 3
std::istringstream iss(line);
if (iss >> n)
{
std::cout << "We read the number " << n << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,要将标记作为字符串读取,您只需将其流式传输到std::string.重要的是要记住格式化的输入操作符通过令牌工作令牌,并且令牌由空格(空格,制表符,换行符)分隔.通常的基本选择是您是完全以令牌(第一版)还是逐行(第二版)处理文件.对于逐行处理,首先使用getline将一行读入字符串,然后使用字符串流来标记字符串.
关于验证的一句话:您无法知道格式化的提取是否会实际成功,因为这取决于输入数据.因此,您应该始终检查输入操作是否成功,如果不成功则中止解析,因为如果发生故障,您的变量将不包含正确的数据,但您以后无法知道.所以总是这样说:
if (in >> v) { /* ... */ } // v is some suitable variable
else { /* could not read into v */ }
if (std::getline(in, line)) { /* process line */ }
else { /* error, no line! */ }
Run Code Online (Sandbox Code Playgroud)
后一种结构通常用在while循环中,逐行读取整个文件:
while (std::getline(in, line)) { /* process line */ }
Run Code Online (Sandbox Code Playgroud)