以逗号分隔的流进入结构体
comma separated stream into struct
我有一个包含一个int和两个字符串的结构体。在读取文件时,前两个值以逗号分隔,最后一个值以换行符结束。第三个参数可以为空。
ex data: 7, John doe, 123-456-7891 123 fake st.
我想让我的程序将获取第一个数字并将其放入int类型中,找到逗号并将第二个数字放入结构体的字符串中,等等。
第一个问题是我应该用类来代替吗?我已经看到了getline(stream, myString, ',');
,但我的参数是不同的数据类型,所以我不能把它们都扔进一个向量。
struct Person{
int id;//dont care if this is unique
string name;
string extraInfo;
};
int main(int argc, char* argv[]){
assert( argc ==2 && "Invalid number of command line arguments");
ifstream inputFile (argv[1]);
assert( inputFile.is_open() && "Unable to open file");
}
存储该信息并从前两个以逗号分隔并以换行符结束的文件中检索该信息的最佳方法是什么?我还希望程序忽略文件中的空白行。
我使用正常的getline()
逐行读取文件。然后,将其放入stringstream
中进行进一步解析,或者使用string
的find()
函数手动拆分文本。
更多注释:
- 我不明白你关于使用类的第一个问题。如果你指的是
- 对你无法控制的东西使用assert是错误的,比如argc。这应该只用于验证您没有犯编程错误。此外,如果您#define NDEBUG,断言就全部消失了,因此它们不应该真正成为程序逻辑的一部分。抛出std::runtime_error("failed to open file")。
- 您可能不希望在字符串中使用双引号。另外,您可能希望
"a,b"
不要被逗号分隔。确保您有断言所需功能的测试。
Person
,那么答案是没关系。您仍然可以使用getline
方法来标记一行,但是您首先必须读取该行:
vector<Person> people;
string line;
int lineNum = 0;
while( getline(inputFile, line) )
{
istringstream iss(line);
lineNum++;
// Try to extract person data from the line. If successful, ok will be true.
Person p;
bool ok = false;
do {
string val;
if( !getline(iss, val, ',') ) break;
p.id = strtol( val.c_str(), NULL, 10 );
if( !getline(iss, p.name, ',') ) break;
if( !getline(iss, p.extraInfo, ',') ) break;
// Now you can trim the name and extraInfo strings to remove spaces and quotes
//[todo]
ok = true;
} while(false);
// If all is well, add the person to our people-vector.
if( ok ) {
people.push_back(p);
} else {
cout << "Failed to parse line " << lineNum << ": " << line << endl;
}
}
使用getline获得字符串中的行后,请使用strtok。
char myline[] = "7, john doe, 123-456-7891 123 fake st.";
char tokens = strtok(myline, ",");
while(tokens)
{
//store tokens in your struct values here
}
您需要包含#include <string.h>
来使用strtok
相关文章:
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 包含 std::list 的结构体的 C++ 初始化
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 如何使用结构体的向量数组?
- 如何使用结构体在C++中更改这些代码?
- 无法在 Mosquitto MQTT Broker 插件上访问结构体 mosquitto 的元素
- 我应该如何在C++中使用结构体解决输入失败的问题?
- Qsort() 比较结构体整数的总和
- 如何使用迭代器指向结构体c++的向量
- 在C++中使用链表的堆栈实现中,访问结构体headNode成员count和top会导致运行时错误
- 如何获取结构体成员的地址
- 创建结构体向量,表达式:向量下标超出范围
- boost::任何带有结构体和无符号整数
- 如何在构造函数中初始化结构体的动态数组?
- 只写结构体的某些字段
- C++ push_back() 一个结构体到一个向量中
- C++14 结构体上的统一初始化
- 以逗号分隔的流进入结构体