gpt4 book ai didi

c++ - 使用 C++ ifstream 提取运算符>> 从文件中读取格式化数据

转载 作者:IT老高 更新时间:2023-10-28 23:14:52 31 4
gpt4 key购买 nike

作为我的学习,我正在尝试使用 c++ ifstream 及其运算符>> 使用下面的代码从文本文件中读取数据。文本文件 outdummy.txt 有以下内容:

just dummy
Hello ofstream
555

我的问题是如何将文件中存在的 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;
}

最佳答案

如果您想使用格式化输入,您必须提前知道预期的数据并将其读入相应数据类型的变量中。例如,如果您知道数字始终是第五个标记,就像您的示例一样,您可以这样做:

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;
}

另一方面,如果你知道这个数字总是在第三行,它本身:

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;
}

如您所见,要将 token 读取为字符串,您只需将其流式传输到 std::string 中。重要的是要记住格式化输入运算符逐个标记地工作,并且标记由空格(空格、制表符、换行符)分隔。通常的基本选择是您是完全以 token (第一个版本)还是逐行(第二个版本)处理文件。对于逐行处理,您首先使用 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! */ }

后一种结构通常用在while循环中,逐行读取整个文件:

while (std::getline(in, line)) { /* process line */ }

关于c++ - 使用 C++ ifstream 提取运算符>> 从文件中读取格式化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7443787/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com