我怎么能读字符串和整数,在同一行从文本文件

How can i read string and integer, on same line from a text file?

本文关键字:一行 文件 文本 字符串 怎么能 整数      更新时间:2023-10-16

我有这个例子,

在我的。txt文件中我有" Jorge Saraiva 1321312 "

my .cpp

string line, nome;
int number;
ifstream ifi("nameOfFile.txt");
 if(!ifi.is_open()){
   cout << "Error opening file" << ends;
 }
 {
  else{
    while( getline(ifi,line) ){
      istringstream is(line);
       is >> nome; 
       is >> number; 
    }
    ifi.close();
  }
 cout << nome  << endl << number << ends;

有了这个,我只有名字("豪尔赫"),我不知道我怎么能告诉编译器当名称/字符串结束。

您试图将字符串(第二个)放入数字中,这是导致意外输出的原因。将它定向到字符串应该可以解决这个问题。你可以丢弃这个字符串,没关系。

string line, name, dummy;
int number;
while(getline(ifi, line)){  
    istringstream iss1(line);
    iss1 >> name; 
    iss1 >> dummy;
    iss1 >> number; 
}

我可以为你的问题找到一个解决方案。如果您希望有多个名称(无论大小),然后在前面有一个数字,您可以利用isdigit函数。

当从文件中读取时,可以在while循环中添加如下内容:

String temp;
is >> name; 
    while (is){
    is >> temp; 
    if(isdigit(temp[0])){
            int number = atoi(temp.c_str()); } 
    else {
          name += " " + temp;
       }
    }

这样你可以有多个大小的名字。

我是在手机上写的,所以比较困难,但是你可以明白我在说什么。然而,不要忘记包括图书馆。

大多数情况下,在处理csv文件时,您的数据用分号或其他字符分隔。如果你没有,那么你必须做更高级的解析。您可以使用regexp:

#include <regex>
// ...
// Pattern
std::regex pattern("([^\d]+)\s*([\d ]+)" );
// ...
// And instead of istringstream
std::smatch sm;
if (std::regex_match(line, sm, pattern)) {
  nome = sm[1];
  number = std::stoi(sm[2]);
}

您可以选择继续提取为整数,除非成功

int number;
string name;
istringstream record(line);
// keep trying till a number is found.
record >> number;
while (record.fail() && !record.eof()) {
    record.clear();
    string temp;
    record >> temp;
    name.append(temp);
    record >> number;
}
cout << "Name: "   << name   << endl;
cout << "Number: " << number << endl;

完整代码:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main ()
{
    string line;
    while (getline(cin, line)) {
        int number;
        string name;
        istringstream record(line);
        // keep trying till a number is found.
        record >> number;
        while (record.fail() && !record.eof()) {
            record.clear();
            string temp;
            record >> temp;
            name.append(temp);
            record >> number;
        }
        cout << "Name: "   << name   << endl;
        cout << "Number: " << number << endl;
    }

    return 0;
}

试试这个代码

string line, firstname,lastname;
int number;
ifstream ifi("nameOfFile.txt");
if (!ifi.is_open()) 
{
cout << "Error opening file" << ends;
}
else
{
while (ifi>>firstname>>lastname>>number) {}
ifi.close();
}
cout << firstname <<endl<<lastname <<endl << number << ends;