以逗号分隔的流进入结构体

comma separated stream into struct

本文关键字:结构体 分隔      更新时间:2023-10-16

我有一个包含一个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中进行进一步解析,或者使用stringfind()函数手动拆分文本。

更多注释:

    我不明白你关于使用类的第一个问题。如果你指的是Person,那么答案是没关系。
  • 对你无法控制的东西使用assert是错误的,比如argc。这应该只用于验证您没有犯编程错误。此外,如果您#define NDEBUG,断言就全部消失了,因此它们不应该真正成为程序逻辑的一部分。抛出std::runtime_error("failed to open file")。
  • 您可能不希望在字符串中使用双引号。另外,您可能希望"a,b"不要被逗号分隔。确保您有断言所需功能的测试。

您仍然可以使用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