C ++从带有字符的文件中读取数字

C++ Read numbers from a file with characters

我希望能够将输入文件中的所有数字相加以求出总和,但我不确定该怎么做?我可以使用一些指示。 这是输入文本文件包含的内容:

Mark Cyprus 21
Elizabeth Monroe 45
Tom McLaugh 82
Laura Fairs 3
Paul Dantas 102

这是我目前的代码

#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <stdlib.h>
#include <sstream>
using namespace std;

class Age
{
    //Create the variables
    string first_name, last_name;
    int age, sum_age, average_age;

public:
    bool isblank(const std::string& s)            
    {    //True if s is empty or only contains space and/or TABs.          
         return s.find_first_not_of(" \t")==std::string::npos;            
    }
    void readFile ()            
    {   
          ifstream file;           
          file.open("input_age.txt");     
          string line;                
          // file opened?                
          if (! file) {                    
              cerr << "can’t open input file." << endl; 
              exit(EXIT_FAILURE);                
           }
          // getline is true for as long as end of file is not reached            
          while(std::getline (file,line)){                    
              if (! isblank(line)){                        
                   // now the variable string "line" contains the line content  
                   file >> first_name;
                   file >> last_name;
                   file >> age;              
              }                
          }                
          file.close();            
          }    

有没有办法只抓年龄而不看名字?我不相信我真的需要这个名字。所以最好删除那些 first_name 和 last_name 变量,但我不确定如何只读取文件中的数字。

存在问题:

while(std::getline (file,line)){                    
    if (! isblank(line)){                        
    // now the variable string "line" contains the line content  
    file >> first_name;
    file >> last_name;
    file >> age;              
}             

完成 getline 后,变量 line 中已有 3 个值,但您从未使用过它。您正在进行第二次阅读...因此您忽略了输入中的一半行。

你应该做的是:

while(file >> first_name >> last_name >> age)
{
    //do whatever you want to do with age in here
}

如果您无法读取包含 2 个字符串和 1 个数字的序列,则此循环将结束,这可能是由于到达文件末尾或输入格式不正确。

通过这样阅读,您不需要 isblank 方法。

这是一个似乎同样有效的 C 解决方案:

#include <stdio.h>
#include <assert.h>
#define MAX_NAME_LENGTH 128
int main(int argc, char **argv)
{
    int number;
    char first_name[MAX_NAME_LENGTH];
    char second_name[MAX_NAME_LENGTH];
    FILE *fl=fopen("input.txt","rt");
    assert(fl && "could not open input file");

    while (fscanf(
        fl,
        "%s %s %d",
        first_name,
        second_name,
        &number) == 3)
    {
        printf("%s +++ %s +++ %d\n",first_name,second_name,number);
    }

    fclose(fl);
    return 0;
}