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

时间:2011-09-16 11:09:10

标签: c++ operators ifstream

根据我的学习,我正在尝试使用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;
}

4 个答案:

答案 0 :(得分:15)

如果要使用格式化输入,则必须事先知道要预期的数据,并将其读入相应数据类型的变量。例如,如果您知道该数字始终是第五个标记,则在您的示例中,您可以执行此操作:

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

如您所见,要将标记作为字符串读取,您只需将其流式传输到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! */ }

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

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

答案 1 :(得分:2)

  1. ifstream默认为ios_base::in。您无需指定它。
  2. operator>>可以作为运算符直接调用:in >> a
  3. 读取字符串是相同的:in >> s,但需要注意的是它是以空格分隔的,因此它将自己读取“just”,而不是“dummy”。
  4. 如果您想阅读完整的行,请使用std::getline(in, s)

答案 2 :(得分:1)

由于您已选择使用C字符串,因此您可以使用ifstream对象的getline方法(而非std::getline()std::string s一起使用),将允许您指定C字符串和缓冲区的最大大小。

根据您所拥有的内容,并为第二行添加额外的缓冲区:

char buf[100];
char buf2[100];

in.getline(buf,sizeof(buf));
in.getline(buf2,sizeof(buf2));
in >> a;

然而,正如其他海报所提议的那样,尝试使用std::string及其方法,它会让您的生活更轻松。

答案 3 :(得分:0)

您可以阅读文件内容并使用Finite State Machine进行解析。

示例:

void Parse(const char* buffer, size_t length);
size_t GetBufferSize();

size_t bufferSize = GetBufferSize();
char* buffer = new char[bufferSize];

std::ifstream in("input.txt");
while(in.getline(buffer, bufferSize)) {
    Parse(buffer, in.gcount());
}

或者,您可以使用Flex之类的工具编写解析器。