C++ ifstream,使用“;”加载问题
C++ ifstream, issue loading with ";"
int a, b;
while (infile >> a >> b)
{
// process pair (a,b)
}
这是我一直在看的代码,但我 运行 遇到了问题,因为我的字符串之间没有空格,它们有“;”
我的代码:
void load(string filename){ // [LOAD]
string line;
ifstream myfile(filename);
string thename;
string thenumber;
if (myfile.is_open())
{
while (myfile >> thename >> thenumber)
{
cout << thename << thenumber << endl;
//map_name.insert(make_pair(thename,thenumber));
}
myfile.close();
}
else cout << "Unable to open file";
}
[Inside the txt.file]
123;peter
789;oskar
456;jon
我现在得到的是 "thename" 作为 123;peter 和 "thenumber" 作为 789;oskar。
我希望 "thename" 为 peter,"thenumber" 为 123,这样我就可以将它正确地插回到我的地图中,怎么样?
您必须输入一个字符串,然后拆分它才能得到姓名和号码
....
#include <string>
#include <sstream>
#include <vector>
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
split(s, delim, elems);
return elems;
}
....
void load(string filename){
..........
if (myfile.is_open())
{
while (myfile >>whole)
{
std::vector<std::string> parts = split(whole, ';');
name = parts[0];
number = parts[1];
}
}
infile >> a 从infile 中读取符合条件的类型为a。在您的情况下,a 是 int,因此 '>>' 期望找到一个 int。在您的代码中 myfile >> thename >> thenumber 都是字符串类型,因此他们期望您的文件中的字符串类型。问题是字符串包含';'所以变量名将占用所有行,直到找到 \n(new line).
在您的代码中
std::string thename, thenumber;
char delimeter(';'); //It is always '-' is it?
std::getline(std::cin, thename, delimeter);
std::getline(std::cin, thenumber);
同样,数字将是字符串类型。要将您的 thenumber 转换为 int:
std::istringstream ss(thenumber);
int i;
ss >> i;
if (ss.fail())
{
// Error
}
else
{
std::cout << "The integer value is: " << i;
}
return 0;
读取格式的文件相当简单。您可以使用 std::getline
和不同的分隔符来告诉它在哪里停止读取输入。
while(getline(myfile, thenumber, ';')) // reads until ';' or end of file
{
getline(myfile, thename); // reads until newline or end of file
map_name.insert(make_pair(thename,thenumber));
}
int a, b;
while (infile >> a >> b)
{
// process pair (a,b)
}
这是我一直在看的代码,但我 运行 遇到了问题,因为我的字符串之间没有空格,它们有“;”
我的代码:
void load(string filename){ // [LOAD]
string line;
ifstream myfile(filename);
string thename;
string thenumber;
if (myfile.is_open())
{
while (myfile >> thename >> thenumber)
{
cout << thename << thenumber << endl;
//map_name.insert(make_pair(thename,thenumber));
}
myfile.close();
}
else cout << "Unable to open file";
}
[Inside the txt.file]
123;peter
789;oskar
456;jon
我现在得到的是 "thename" 作为 123;peter 和 "thenumber" 作为 789;oskar。 我希望 "thename" 为 peter,"thenumber" 为 123,这样我就可以将它正确地插回到我的地图中,怎么样?
您必须输入一个字符串,然后拆分它才能得到姓名和号码
....
#include <string>
#include <sstream>
#include <vector>
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
split(s, delim, elems);
return elems;
}
....
void load(string filename){
..........
if (myfile.is_open())
{
while (myfile >>whole)
{
std::vector<std::string> parts = split(whole, ';');
name = parts[0];
number = parts[1];
}
}
infile >> a 从infile 中读取符合条件的类型为a。在您的情况下,a 是 int,因此 '>>' 期望找到一个 int。在您的代码中 myfile >> thename >> thenumber 都是字符串类型,因此他们期望您的文件中的字符串类型。问题是字符串包含';'所以变量名将占用所有行,直到找到 \n(new line).
在您的代码中
std::string thename, thenumber;
char delimeter(';'); //It is always '-' is it?
std::getline(std::cin, thename, delimeter);
std::getline(std::cin, thenumber);
同样,数字将是字符串类型。要将您的 thenumber 转换为 int:
std::istringstream ss(thenumber);
int i;
ss >> i;
if (ss.fail())
{
// Error
}
else
{
std::cout << "The integer value is: " << i;
}
return 0;
读取格式的文件相当简单。您可以使用 std::getline
和不同的分隔符来告诉它在哪里停止读取输入。
while(getline(myfile, thenumber, ';')) // reads until ';' or end of file
{
getline(myfile, thename); // reads until newline or end of file
map_name.insert(make_pair(thename,thenumber));
}