【问题标题】:read file line by line and store different variables逐行读取文件并存储不同的变量
【发布时间】: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,即使它在这里是一个制表符而不是逗号,你应该在网上找到关于解析它的足够信息。

标签: c++ readfile


【解决方案1】:

在我的机器上测试时,您的方法完全符合您的要求,除了它将在第三个条目处停止:

3     97    Peter Warrington    18:26   29  M   New haven

这是因为New haven 中的空格导致while 条件失败,因为它无法在下一次迭代中复制到整数字段a。如果你想保持这种结构,也许用下划线代替空格。否则转而逐行解析它,可能使用std::regex 库。

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

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

(确保包含algorithm

我们现在已经全部打印好了!

要直接回答您的原始问题,我猜该文件不存在。

std::ifstream infile("text.txt");
if(!infile.is_open()) {
     std::cout<<"Couldn't find file";
     return 0;
}
// ..

【讨论】:

  • 谢谢!那么,如果有一行没有那个人的名字,一个城镇,只有其他六个变量。我刚刚在我的文本文件中发现。
  • 如果缺少其中任何一个,您就会遇到问题。也许将不太重要的读取调用 (infile&gt;&gt;x) 移到 while 循环之外,以允许它们优雅地失败。这样,当缺少东西等时它就不会崩溃。虽然这确实意味着您必须验证您稍后获得的输入是否有效。