C++ 逐行读取文件并存储不同的变量

C++ 逐行读取文件并存储不同的变量,c++,readfile,C++,Readfile,我的文本文件如下所示: 1 52 Hayden Smith 18:16 15 M Berlin 2 54 Mark Puleo 18:25 15 M Berlin 3 97 Peter Warrington 18:26 29 M New haven 4 305 Matt Kasprzak 18:53 33 M Falls Church 5 272

我的文本文件如下所示:

1     52    Hayden Smith        18:16   15  M   Berlin
2     54    Mark Puleo          18:25   15  M   Berlin
3     97    Peter Warrington    18:26   29  M   New haven
4     305   Matt Kasprzak       18:53   33  M   Falls Church
5     272   Kevin Solar         19:17   16  M   Sterling
6     394   Daniel Sullivan     19:35   26  M   Sterling
7     42    Kevan DuPont        19:58   18  M   Boylston
8     306   Chris Goethert      20:00   43  M   Falls Church
9     262   James Sullivan      20:12   28  M   Sterling
10    348   Bill Gaudere        20:17   54  M   Hudson
11    13    Travis Wheeler      20:23   31  M   Clinton
12    69    Eric Anderson       20:34   54  M   Clinton
13    341   Alex Teixeira       20:46   0   M   Clinton
14    112   James Long          20:50   38  M   0
15    279   Nate Richards       21:31   17  M   Berlin
......................................................
while(getline(infield, s)):
共有八列,由“制表符”分隔,除了名字和姓氏由空格分隔

我必须有八种不同类型的变量

    int a;
    int b;
    string c;
    string d;
    string e;
    int f;
    char g;
    string h;
我需要一行一行地读文件,并能把每一行的a,b,c,d,e,f都读出来。 我还需要这些变量供以后使用

所以,我试过这个:

std::ifstream infile("text.txt");
int a;
int b;
string c;
string d;
string e;
int f;
char g;
string h;


while(infile>>a>>b>>c>>d>>e>>f>>g>>h)
{
    cout <<"C is: "<<c<<endl;   // just to see if the loop is working.

}

但是,这不是给了我一条很大的线,所有的字符串和整数都被拼凑在一起了吗

在我的机器上测试时,您的方法完全按照您希望的方式工作,除了它将在第三个条目处停止:

3     97    Peter Warrington    18:26   29  M   New haven
这是因为
纽黑文
中有空格,该空格将使while条件失效,因为在下一次迭代时无法将其复制到整数字段
a
。如果您想保持这种结构,可以用下划线代替空格。否则,可以使用
std::regex
库逐行解析它

例如,将位置字符串更改为用下划线而不是空格分隔会导致查找所有15个条目。要将下划线改回空格,我们可以使用
std::replace
,这样while循环的主体看起来像lile:

std::cout <<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<g<<" ";
std::replace( h.begin(), h.end(), '_', ' ' );
std::cout<<h<<"\n";

我不完全确定你是否能在一行中做到这一点,但我建议不要这样做。您读入的每个条目都有可能出错(例如,类型不正确)。我认为您应该编写检查错误的代码(或者至少是调试代码)。此外,与在多个表达式中执行相比,在一个表达式中执行并不能真正提高性能。将该文件格式视为八列是您的方法的一个大问题。有人会在那里输入诸如“李·哈维·奥斯瓦尔德”或“巴拉克·侯赛因·奥巴马”之类的名字来终止你的程序。不,第一个名字和第二个名字之间没有制表符是有原因的,原因是它们应该被视为一列。顺便说一句,这也适用于纽黑文。顺便说一句:文件格式的家族被称为CSV,即使它是一个标签而不是逗号,你应该在网上找到足够的关于解析它的信息。谢谢!那么,如果有一行没有这个人的名字,还有一个城镇,只有其他六个变量呢。我刚在我的文本文件中发现。如果其中任何一个丢失了,你就会有问题。也许可以将不太重要的读取调用(
infle>>x
)移出while循环,以允许它们正常地失败。这样它就不会在东西丢失等情况下崩溃。尽管这意味着您必须验证稍后获得的输入是否有效。
std::ifstream infile("text.txt");
if(!infile.is_open()) {
     std::cout<<"Couldn't find file";
     return 0;
}
// ..