我有一个带有int和两个字符串的结构。在文件中读取时,前两个值的逗号分隔,最后一个值由换行符终止。然而,第三个参数可能是空的。
ex data:7,john doe,123-456-7891 123 fake st。
我想这样做,以便我的程序将获取第一个数字并将其放入int中,找到逗号并将第二个数字放在struct的字符串中等。
第一个问题是我应该使用课吗?我见过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");
}
存储此信息并从前两个以逗号分隔并以换行符结尾的文件中检索信息的最佳方法是什么?我还希望程序忽略文件中的空白行。
答案 0 :(得分:1)
我使用普通getline()
逐行阅读文件。然后,将其放入stringstream
进行进一步解析,或使用string
的{{1}}函数手动拆分文本。
更多说明:
find()
,那么答案就是没关系。Person
不被逗号分割。确保您拥有断言所需功能的测试。答案 1 :(得分:0)
您仍然可以使用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;
}
}
答案 2 :(得分:0)
使用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