我需要格式化我的程序以获取可变数量的输入。通过变量,我的意思是输入中的行数将不知道。输入应按如下方式传递:
cat input | ./myProg
我编写了这个版本的程序,它成功地获取了一行输入,将其存储到char缓冲区,并打印到控制台:
#include <iostream>
#include <fstream>
using namespace std;
int main(void)
{
char outputData[1024];
cin.getline(outputData,1024);
cout << outputData;
return 0;
}
我需要帮助推广这个程序来获取可变数量的行并将它们存储在一个大的char缓冲区中以便稍后进行操作。我编写了以下代码,但它没有向控制台打印任何信息:
#include <iostream>
#include <fstream>
using namespace std;
int main(void)
{
char outputData[1024];
while(!cin.eof())
{
cin.getline(outputData,1024);
}
cout << outputData;
return 0;
}
答案 0 :(得分: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
,我敢用更少的代码来做: - )
答案 1 :(得分: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
}