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