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;
}
// ..