我正在尝试做我的家庭作业,我需要一些建议。我有一个文本文件,其中包含由...分隔的数字(两列)。例如,
123124 , 12312512
5133421 , 12312412
文件中会有更多行。我需要在第一列和第二列中添加所有数字(需要打印出两者)。然后,我需要添加两列。所以,我的问题是什么是完成任务的最佳方式?提前致谢。我起初在想strtok()。但是,它不起作用,因为我需要打印出第一列和第二列的总和。
您可以将值读入两个std::vector
对象:
// Example input data
std::istringstream in(R"~(
123124 , 12312512
5133421 , 12312412
)~");
// you can open a file instead and none of the
// other code changes:
//
// std::ifstream in("my_data_file.csv");
std::vector<int> col_1;
std::vector<int> col_2;
int i1;
int i2;
std::string comma; // used to skip past the commas
// we read in and test the results of the read
// as the while condition
while(in >> i1 >> comma >> i2)
{
// We know the read succeeded here so we can safely
// append the numbers to the ends of the vectors
col_1.push_back(i1);
col_2.push_back(i2);
}
// Did we get all the way to the end?
if(!in.eof())
throw std::runtime_error("bad input"); // must be an input error
// process our vectors here
std::cout << "First column: " << '\n';
for(auto i: col_1)
std::cout << i << '\n';
std::cout << "Second column: " << '\n';
for(auto i: col_2)
std::cout << i << '\n';
这样的东西会起作用:
#include <iostream>
#include <fstream>
int main(int argc, char **argv)
{
std::ifstream is(argv[1]);
for (;;)
{
int x1 = 0, x2 = 0;
char sep = 0;
is >> x1;
is >> sep;
is >> x2;
// Validate the data.
if ((sep != ',') or is.eof()) { break; }
// Data tests valid, use it however.
std::cout << "read: " << x1 << sep << x2 << std::endl;
}
}
我真的不喜欢scanf(),这就是原因。这将有效:
int x, y;
fscanf("%d, %d",&x, &y);
如果你将x, y
更改为short int,fscanf()
将访问无效的内存(繁荣)。
如果你将x, y
更改为long int fscanf()
会给你不正确的结果。
鉴于这两个选择,我非常希望使用std :: istream。