C++从文件读取不同类型的数据,直到有一个字符串以数字开头。 在C++中,我想从包含不同类型数据的输入文件中读取:第一个名称是参赛者的2个或更多个带白符号的字符串,然后是一个没有空白的ID字符串,总是以数字开头,然后是另一个没有WS的字符串,一个数字是体育和它们所达到的位置。

C++从文件读取不同类型的数据,直到有一个字符串以数字开头。 在C++中,我想从包含不同类型数据的输入文件中读取:第一个名称是参赛者的2个或更多个带白符号的字符串,然后是一个没有空白的ID字符串,总是以数字开头,然后是另一个没有WS的字符串,一个数字是体育和它们所达到的位置。,c++,string,file-read,C++,String,File Read,例如: 我向您展示了我开始编写的代码,然后又结巴了 void ContestEnor::next() { string line; getline(_f , line); if( !(_end = _f.fail()) ){ istringstream is(line); is >> _cur.contestant >> _cur.id; // here I don't know how to go on

例如:

我向您展示了我开始编写的代码,然后又结巴了

void ContestEnor::next()
{
    string line;
    getline(_f , line);
    if( !(_end = _f.fail()) ){
        istringstream is(line);
        is >> _cur.contestant >> _cur.id; // here I don't know how to go on
        _cur.counter = 0;
        //...
    }
}

提前感谢您的帮助。

您应该研究如何使用分隔符。这样,您可以在空格字符上划界并读取,直到找到一个字符串,其中数字中的第一个字符位于该字符串中。这是一个简短的代码示例,看起来很像家庭作业,所以我不想为您编写太多;:

std::string temp, id;

while (std::getline(_f, temp, ' ')) {
    if (temp[0] >= 0 && temp[0] <= '9') {
        id = temp;
    }
    // you would need to add more code for the rest of the data on that line
}

/* close the file, etc. */

这段代码应该是非常自解释的。要知道的最重要的一点是,可以使用std::getline获取数据,直到一个分隔符。使用分隔符,就像在换行符上进行分隔的默认行为一样。因此,getline的名称并不完全准确——如果需要,您仍然只能得到一行的一部分。

不完全确定您在这里要问什么。在我看来,你似乎想让乔希·迈克尔·艾伦成为我们的参赛者。C++的IOstreams没有提供一个没有唯一分隔符的工具来实现这一点,并且名称中的空格和标记之间的空格会去除分隔符的唯一性。乔希·迈克尔·艾伦(Josh Michael Allen)| 1063Szinyei |跑步3 |游泳1 |跳跃1 |你可以使用getlineis,| cur.competitor,| | | | | |在唯一分隔符上拆分。如果允许,请更改存储协议。更简单。如果你不能。。。如果有固定数量的运动项目可以在比赛结束时开始,向后阅读运动项目,则ID和剩余部分必须是参赛者的姓名。如果你不知道会有多少项运动,你必须祈祷参赛者的名字中没有数字。从字符串开始扫描,直到找到与ID签名匹配的标记。存储ID。ID之前的所有内容都是名称的一部分。保存它。ID后面的所有内容都是字符串数字对。阅读并存储这些对,直到你到达行的末尾。哈哈,谢谢你,我需要这样做,我不能修改输入文件。我以前有过这样或类似的想法,但因为这是一个家庭作业,我需要像那样使用这个文件。。查克,第二条评论给出了一些可能性。最简单的可能是第二个选项,扫描与ID字符串签名匹配的令牌。例如,如果ID字符串必须以数字开头,则可以查找以数字开头的令牌。当然,如果使用像5usan 3radshaw这样的名称,这将失败,从而使分隔符更加有效。@user4581301我的道歉,已编辑。我想我是在考虑scanf,因为我整天都在使用C。另外,我对getline的解释是空格可以作为分隔符,但是如果他们将此文件更改为逗号分隔,则可以很容易地对其进行修改。在本例中,提取操作符的操作方式相同,但getline更适合其他情况。
std::string temp, id;

while (std::getline(_f, temp, ' ')) {
    if (temp[0] >= 0 && temp[0] <= '9') {
        id = temp;
    }
    // you would need to add more code for the rest of the data on that line
}

/* close the file, etc. */