在C++中获取空白后面的行

Get the line after white-space in C++

本文关键字:空白 C++ 获取      更新时间:2023-10-16

我想读取文本文件每行中的最后几个字符。在经过更好优化的C++代码中,我该如何做到这一点?例如,我的文件中的姓名和年龄由100名学生的空白分隔,每个学生都有新行,所以我只想阅读空白后的内容,即年龄,并进行进一步的比较。

 File classlist.txt
 Tanya 24
 Max 16
 Dic 21 

到目前为止我写的代码

 #include <fstream>
 #include <iostream>
 using namespace std;
 int main()
 {
    ifstream class_details("classlist.txt");
    if (!class_details.is_open())
    {
        cout<< "error"<<'n';
        return;
    }
    string data;
    % From here I am thinking on how to get the data after first whitespace            
    % in each line
    class_details.close();
    return 0;
    }

@Joachim指出,输入运算符>>在空白处分离。

您可以按如下方式使用它:

string name;
int age;
while (class_details >> name >> age) {
   // Use name & age here.
}

class_details >> name从输入流中提取一个单词(非空白字符),并将其存储在name变量中,并返回原始流对象class_details。这允许链接输入提取。。。

(由于class_details >> name返回class_details,我们可以进一步将>>应用于表达式的返回值,以提取更多信息。)

>> age继续提取,从输入流中读取(由于age是整数变量)一个整数,并将其存储在age变量中,并且(继续链)返回原始流对象class_details

while(...)循环中的表达式返回(由于>>运算符允许链接的方式)原始输入流,当在boolean上下文中进行求值时,原始输入流返回流的good()状态。如果遇到流的末尾,或者试图进行无效提取,或者出现任何其他问题,good()将返回false,并退出循环。

因此,在没有链接的情况下(而是使用,运算符),上面的内容可以更详细地重写为:

string name;
int age;
while(class_details >> name, class_details >> age, class_details.good()) {
    // Use name & age here.
}

编辑

如果目标是忽略名称字段(跳过名称而不将其提取到变量中),则可以使用ignore()方法跳过所有内容,直到下一个空格字符:

int age;
while (class_details.ignore(numeric_limits<streamsize>::max(), ' ') >> age >> ws) {
   // Use age here.
}

>> ws用于消耗从"年龄"字段末尾到下一行名称字段开头的任何空白。。。特别是"换行"字符。

如果需要,您可以使用小于numeric_limits<streamsize>::max()的数字。只需选择比你最长的名字更长的名字。

使用我鲜为人知的

1:每次复制数据以比较是否相同中断

    while(1)
    {
    fgets(str1, sizeof(str1), f); // scanf what you want
    if( strcmp(str1,str2)==0 )break;
    strcpy(str2,str1);
    }

2:最后添加了一些奇怪的

    while(1)
    {
    fgets(str1, sizeof(str1), f); // scanf what you want
    if( str1 == "key" )break;
    }