读取输入文件并将数据存储到数组中(初学者)!
Reading an Input File And Store The Data Into an Array (beginner)!
输入文件:
1 4 red
2 0 blue
3 1 white
4 2 green
5 2 black
我想要做的是获取每一行并将其存储到二维数组中。
例如:
array[0][0] = 1
array[0][1] = 4
array[0][2] = red
array[1][0] = 2
array[1][1] = 0
array[1][2] = blue
etc..
代码我正在处理它:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
int convert_str_to_int(const string& str) {
int val;
stringstream ss;
ss << str;
ss >> val;
return val;
}
string getid(string str){
istringstream iss(str);
string pid;
iss >> pid;
return pid;
}
string getnumberofcolors(string str){
istringstream iss(str);
string pid,c;
iss >> pid>>c;
return c;
}
int main() {
string lineinfile ;
vector<string> lines;
ifstream infile("myinputfile.txt");
if ( infile ) {
while ( getline( infile , lineinfile ) ) {
lines.push_back(lineinfile);
}
}
//first line - number of items
int numofitems = convert_str_to_int(lines[0]);
//lopps items info
string ar[numofitems ][3];
int i = 1;
while(i<=numofitems ){
ar[i][0] = getid(lines[i]);
i++;
}
while(i<=numofitems ){
ar[i][1] = getarrivel(lines[i]);
i++;
}
infile.close( ) ;
return 0 ;
}
当我添加第二个 while 循环时,我的程序由于某种原因停止工作!
有没有其他方法可以解决这个问题,或者我的程序可以解决这个问题。
最好向您展示如何做得更好:
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main() {
ifstream infile("myinputfile.txt"); // Streams skip spaces and line breaks
//first line - number of items
size_t numofitems;
infile >> numofitems;
//lopps items info
vector<pair<int, pair<int, string>> ar(numofitems); // Or use std::tuple
for(size_t i = 0; i < numofitems; ++i){
infile >> ar[i].first >> ar[i].second.first >> ar[i].second.second;
}
// infile.close( ) ; // Not needed -- closed automatically
return 0 ;
}
您可能正在解决某种简单的算法任务。看看 std::pair
和 std::tuple
,它们不仅可以用作两个元素的容器,而且还因为它们的天然比较运算符。
给出的答案确实比你的好很多。我认为我应该指出您的一些设计缺陷并提供一些改进建议。
- 您重新定义了一个标准中已经存在的函数,即
std::stoi()
将字符串转换为整数。记住,如果一个函数
已经存在,可以重用它,不要认为你必须重新发明什么
已经被发明了。如果您不确定,请搜索您最喜欢的 C++ 参考指南。
- 当您将数据存储为完整字符串时,该解决方案存储数据 "as is"。这真的没有意义。你事先知道数据是什么,利用它来发挥你的优势。另外,当你像这样存储一行数据时,必须先对其进行解析、转换和构造,然后才能以任何方式使用它,而在解决方案中,数据构造一次且仅一次。
因为数据的格式是事先已知的,所以加载信息的更好方法是定义结构以及 input/output 运算符。这看起来像这样:
struct MyData
{
int num1;
int num2;
std::string color;
friend std::ostream& operator << (std::ostream& os, const MyData& d);
friend std::istream& operator >> (std::istream& os, const MyData& d);
};
那么你可以简单地做这样的事情:
...
MyData tmp;
outfile << tmp;
vData.push_back(tmp);
...
他们的意图不是问题,我们显然是从流中读取数据类型并将其存储在容器中。如果有的话,它比您的原始解决方案或提供的解决方案更清楚您在做什么。
输入文件:
1 4 red
2 0 blue
3 1 white
4 2 green
5 2 black
我想要做的是获取每一行并将其存储到二维数组中。 例如:
array[0][0] = 1
array[0][1] = 4
array[0][2] = red
array[1][0] = 2
array[1][1] = 0
array[1][2] = blue
etc..
代码我正在处理它:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
int convert_str_to_int(const string& str) {
int val;
stringstream ss;
ss << str;
ss >> val;
return val;
}
string getid(string str){
istringstream iss(str);
string pid;
iss >> pid;
return pid;
}
string getnumberofcolors(string str){
istringstream iss(str);
string pid,c;
iss >> pid>>c;
return c;
}
int main() {
string lineinfile ;
vector<string> lines;
ifstream infile("myinputfile.txt");
if ( infile ) {
while ( getline( infile , lineinfile ) ) {
lines.push_back(lineinfile);
}
}
//first line - number of items
int numofitems = convert_str_to_int(lines[0]);
//lopps items info
string ar[numofitems ][3];
int i = 1;
while(i<=numofitems ){
ar[i][0] = getid(lines[i]);
i++;
}
while(i<=numofitems ){
ar[i][1] = getarrivel(lines[i]);
i++;
}
infile.close( ) ;
return 0 ;
}
当我添加第二个 while 循环时,我的程序由于某种原因停止工作! 有没有其他方法可以解决这个问题,或者我的程序可以解决这个问题。
最好向您展示如何做得更好:
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main() {
ifstream infile("myinputfile.txt"); // Streams skip spaces and line breaks
//first line - number of items
size_t numofitems;
infile >> numofitems;
//lopps items info
vector<pair<int, pair<int, string>> ar(numofitems); // Or use std::tuple
for(size_t i = 0; i < numofitems; ++i){
infile >> ar[i].first >> ar[i].second.first >> ar[i].second.second;
}
// infile.close( ) ; // Not needed -- closed automatically
return 0 ;
}
您可能正在解决某种简单的算法任务。看看 std::pair
和 std::tuple
,它们不仅可以用作两个元素的容器,而且还因为它们的天然比较运算符。
给出的答案确实比你的好很多。我认为我应该指出您的一些设计缺陷并提供一些改进建议。
- 您重新定义了一个标准中已经存在的函数,即
std::stoi()
将字符串转换为整数。记住,如果一个函数 已经存在,可以重用它,不要认为你必须重新发明什么 已经被发明了。如果您不确定,请搜索您最喜欢的 C++ 参考指南。 - 当您将数据存储为完整字符串时,该解决方案存储数据 "as is"。这真的没有意义。你事先知道数据是什么,利用它来发挥你的优势。另外,当你像这样存储一行数据时,必须先对其进行解析、转换和构造,然后才能以任何方式使用它,而在解决方案中,数据构造一次且仅一次。
因为数据的格式是事先已知的,所以加载信息的更好方法是定义结构以及 input/output 运算符。这看起来像这样:
struct MyData { int num1; int num2; std::string color; friend std::ostream& operator << (std::ostream& os, const MyData& d); friend std::istream& operator >> (std::istream& os, const MyData& d); };
那么你可以简单地做这样的事情:
... MyData tmp; outfile << tmp; vData.push_back(tmp); ...
他们的意图不是问题,我们显然是从流中读取数据类型并将其存储在容器中。如果有的话,它比您的原始解决方案或提供的解决方案更清楚您在做什么。