首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中读取分离文件

在C++中读取分离文件
EN

Stack Overflow用户
提问于 2020-06-02 07:05:33
回答 3查看 102关注 0票数 1

我有一个脚本,它将文本文件读入向量。

代码语言:javascript
复制
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector>
using namespace std;

struct Items
{
    string Name;
    int Number1;
    double Number2;
};

int main()
{
    ifstream file("file4.txt"); 
    vector<Items> player_data;
    Items player_info;
    while (file >> player_info.Name >> player_info.Number1 >> player_info.Number2) { 
        player_data.push_back(player_info);
    }

    for (auto &i : player_data) {
        std::cout << i.Name << ", " << i.Number1 << ", " << i.Number2 << endl;
    }
}

file4.txt包含如下内容:

代码语言:javascript
复制
Wogger Wabbit
2
6.2
Bilbo Baggins
111
81.3
Mary Poppins
29
154.8

如何正确地显示数据?我如何才能给出分隔,这是一个线中断('\n')?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-02 07:50:29

您的代码有一些问题;这个解决方案可以工作,但它并不优雅。我相信这里的人可以给你或者带你去一个更优雅的地方:)

首先,在打开文件之后,您需要检查它是否已打开。

第二,最好使用std::getline()从文件中读取,因为它得到了整个行。当到达空间时,>>会停止。

另外,尽量不要使用using namespace std

编辑

如果文件未打开,则添加错误打印

代码语言:javascript
复制
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cerrno>
#include  <cstring>

using namespace std;

struct Items
{
  string Name;
  int Number1;
  double Number2;
};

int main()
{
  ifstream file("text4.text");
  if(!file.is_open()) // <- check if file opened correctly
  {
    std::cout << std::strerror(errno); // <- print the reason why the file didnt open 
    return 0;
  }
  vector<Items> player_data;
  Items player_info;
  std::string line;
 while(std::getline(file,line)) // <-- read lines and stop when the file is finished 
 {
   player_info.Name = line;
   std::getline(file,line);
   player_info.Number1 = stoi(line);
   std::getline(file,line);
   player_info.Number2 = stod(line);
   player_data.push_back(player_info);
 }


  for (auto &i : player_data) {
    std::cout << i.Name << ", " << i.Number1 << ", " << i.Number2 << endl;
  }
}
票数 3
EN

Stack Overflow用户

发布于 2020-06-02 07:11:43

根据您的描述,我假设您希望逐行打印输出。所以用'\n‘代替逗号:

std::cout << i.Name << "\n" << i.Number1 << "\n" << i.Number2 << endl;

票数 1
EN

Stack Overflow用户

发布于 2020-06-02 08:33:58

你可以用以下方式解决你的问题-

代码语言:javascript
复制
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector>
using namespace std;

struct Items {
    string Name;
    int Number1;
    double Number2;
};

int main() {
    ifstream file("file4.txt");
    vector<Items> player_data;
    Items player_info;
    while (getline(file,player_info.Name)) {
        file>>player_info.Number1>>player_info.Number2;
        player_data.push_back(player_info);
        file.ignore();

    }
    file.close();
    for (auto &i : player_data) {
        cout << i.Name << ", " << i.Number1 << ", " << i.Number2 << endl;
    }
}

现在让我们调查一下这里的陷阱是什么。

  1. 首先,您的名称可以在它们之间包含空格,并且不能使用>>运算符获取带有空空间的输入字符串。您必须使用getline()函数才能接受空空格的输入字符串。此函数将输入整行输入文件作为string.
  2. Secondly,,其他两个输入是整数或其他原始数据类型,因此可以使用>>运算符进行输入。在上面的代码中,这两个输入位于while循环中。
  3. 最后也是最重要的file.ignore()>>运算符在遇到空格' ',换行符'\n'字符时终止输入。因此,在输入player_info.Number2后,输入文件中有一个换行符,所以>>操作符停在这里,但是换行符保留在输入缓冲区中,getline()函数对换行符和空格字符非常敏感,这就产生了一个问题。因此,您必须以某种方式删除或忽略缓冲区的换行符。file.ignore()为你做这份工作。--
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62146584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档