0

我需要格式化我的程序以获取可变数量的输入。通过变量,我的意思是输入中的行数是未知的。输入应按如下方式传递:

cat input | ./myProg

我编写了这个版本的程序,它成功地抓取了一行输入,将其存储到一个字符缓冲区中,然后打印到控制台:

#include <iostream>
#include <fstream>
using namespace std;

int main(void)
{
    char outputData[1024];

    cin.getline(outputData,1024);

    cout << outputData;

    return 0;
}

我需要帮助概括该程序以获取可变数量的行并将它们存储在一个大的字符缓冲区中以供以后操作。我编写了以下代码,但它没有将任何信息打印到控制台:

#include <iostream>
#include <fstream>
using namespace std;

int main(void)
{    
    char outputData[1024];

    while(!cin.eof())
    {
    cin.getline(outputData,1024);
    }

    cout << outputData;

    return 0;
}
4

2 回答 2

2

使用字符串和向量。

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

std::vector<std::string> lines;

for (std::string line; std::getline(std::cin, line); )
{
    v.push_back(std::move(line));
}

在有人来建议 istream 迭代器和子类化之前std::string,我敢你用更少的代码来做这件事 :-)

于 2013-03-04T09:35:31.973 回答
2

在您当前的解决方案中,您会在每个循环中覆盖缓冲区的内容,因此它显然不会像您想要的那样打印每一行。

std::string无论如何,如果您想存储可变数量的字符,您应该使用,您当前的代码仅适用于 1024 个字符或更少的行。要存储任意数量的行,您可以将所有行连接到一个大的 std::string 中,或者如果您想要更轻松的每行访问,您可以将它们存储在一个std::vector字符串中。要直接读入std::string并让 C++ 为您处理内存管理,请使用std::getline()而不是cin.getline()

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

int main()
{
    std::string line;
    std::vector<std::string> lines;
    while (std::getline(std::cin, line)) {
        lines.push_back(line);
    }

    // do something with lines, eg. print them by iterating through the vector
    // and printing each string in it
}
于 2013-03-04T09:36:26.170 回答