【发布时间】:2026-01-14 07:15:01
【问题描述】:
我的文本文件如下所示:
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
......................................................
共有八列,由“制表符”分隔,但名字和姓氏之间用空格分隔。
我必须有八种不同类型的变量。
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.
}
我不需要数组和向量来存储这些变量,我有一个链接结构。现在,我只需要一种方法来读取文件并将这些字符串和整数存储到变量中。 但它不起作用,大声笑。不知道为什么。我也想过用getline,像这样:
while(getline(infield, s)):
但是,这本质上不就是给我一个大粗线,所有字符串和整数都被砸在一起。
【问题讨论】:
-
我不完全确定您是否可以在一行中完成所有操作,但我建议您不要这样做。对于您读入的每个条目,都可能出现错误(例如,类型不正确)。我认为您想编写检查错误的代码(或至少调试代码)。此外,与在多个表达式中执行相比,在一个表达式中执行它并没有真正带来很多性能提升。
-
将该文件格式视为八列是您的方法的一个大问题。有人会在那里输入“Lee Harvey Oswald”或“Barrack Hussein Obama”之类的名字来杀死你的程序。不,名字和名字之间没有制表符是有原因的,原因是它们应该被视为一列。顺便说一句,这也适用于纽黑文。顺便说一句:文件格式系列被称为 CSV,即使它在这里是一个制表符而不是逗号,你应该在网上找到关于解析它的足够信息。