C++中的分离文件读取

C++中的分离文件读取,c++,c++11,C++,C++11,我有一个脚本,可以将文本文件读入向量 #include <iostream> #include <fstream> #include <iomanip> #include <string> #include <vector> using namespace std; struct Items { string Name; int Number1; double Number2; }; int main() {

我有一个脚本,可以将文本文件读入向量

#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;
    }
}

如何正确显示数据?我怎样才能给出分隔符,即换行符“\n”?

根据您的描述,我假设您希望逐行打印输出。因此,请使用“\n”而不是逗号:


根据您的描述,我假设您希望逐行打印输出。因此,请使用“\n”而不是逗号:


std::cout您的代码有一些问题;这个解决方案可行,但并不优雅。我相信这里的人可以给你或指引你去一个更优雅的:

首先-打开文件后,需要检查文件是否已打开

第二,最好使用从文件中读取,因为它可以获取整行内容。>>到达空间时停止

另外,尽量不要使用

编辑

添加了文件未打开时的错误打印

#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;
  }
}

您的代码有一些问题;这个解决方案可行,但并不优雅。我相信这里的人可以给你或指引你去一个更优雅的:

首先-打开文件后,需要检查文件是否已打开

第二,最好使用从文件中读取,因为它可以获取整行内容。>>到达空间时停止

另外,尽量不要使用

编辑

添加了文件未打开时的错误打印

#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;
  }
}

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

#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;
    }
}
现在让我们来调查一下这里的陷阱是什么

首先,您的名称之间可以包含空格,并且不能使用>>运算符输入带有空格的字符串。必须使用getline函数才能获取带有空格的输入字符串。此函数将输入文件的整行作为字符串进行输入。 其次,其他两个输入是整数或其他基本数据类型,因此可以使用>>运算符进行输入。在上面的代码中,这两个输入位于while循环内。 最后也是最重要的文件。忽略。>>运算符遇到空格“”、换行符“\n”时终止输入。因此,在输入player_info.Number2后,输入文件中有一个换行符,因此>>运算符停止在此处,但换行符仍保留在输入缓冲区中,getline函数对换行符和空白字符非常敏感,因此会产生问题。因此,您必须以某种方式删除或忽略缓冲区的换行符。file.ignore为您执行此任务。
你可以用以下方法解决你的问题-

#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;
    }
}
现在让我们来调查一下这里的陷阱是什么

首先,您的名称之间可以包含空格,并且不能使用>>运算符输入带有空格的字符串。必须使用getline函数才能获取带有空格的输入字符串。此函数将输入文件的整行作为字符串进行输入。 其次,其他两个输入是整数或其他基本数据类型,因此可以使用>>运算符进行输入。在上面的代码中,这两个输入位于while循环内。 最后也是最重要的文件。忽略。>>运算符遇到空格“”、换行符“\n”时终止输入。因此,在输入player_info.Number2后,输入文件中有一个换行符,因此>>运算符停止在此处,但换行符仍保留在输入缓冲区中,getline函数对换行符和空白字符非常敏感,因此会产生问题。因此,您必须以某种方式删除或忽略缓冲区的换行符。file.ignore为您执行此任务。
你能澄清一下你想要实现什么,以及现在发生了什么吗?我的印象是,您只需要将输出行中的s替换为\n。这似乎有点太简单了,所以我想我是误解了…你能发布一个例子吗?你希望打印什么?我怎样才能正确显示数据。显示的代码以何种方式无法正确显示?我发送了一个打印屏幕:。问题是命令行上没有显示数据。@Gabriel90问题很可能是在读取文件时出现的,因此实际上没有数据可打印。您确定文件已正确打开吗?也许你的名字错了,或者它在另一个文件夹中?你能澄清一下你想要实现什么,以及现在发生了什么吗?我的印象是,您只需要将输出行中的s替换为\n。这似乎有点太简单了,所以我想我是误解了…你能发布一个例子吗?你希望打印什么?我怎样才能正确显示数据。显示的代码以何种方式无法正确显示?我发送了一个打印屏幕:。问题是命令行上没有显示数据。@Gabriel90问题很可能是在读取文件时出现的,因此实际上没有数据可打印。您确定文件已正确打开吗?可能您的名称有误,或者它位于其他文件夹中?我发送了一个打印屏幕:。问题不在这里
ta在命令行上。因为player_数据中没有元素。打印尺寸并查看。当文件>>player\u info.Name>>player\u info.Number1>>player\u info.Number2时,问题就出现了。文件已打开,但读取不正确。修复它,它就会工作。我发送了一个打印屏幕:。问题是没有在命令行上显示数据。因为player_数据中没有元素。打印尺寸并查看。当文件>>player\u info.Name>>player\u info.Number1>>player\u info.Number2时,问题就出现了。文件已打开,但读取不正确。修复它,它就会工作。我可以建议添加一些代码来帮助您发现文件何时无法正确打开吗?您可以打印一个日志行,或者返回一个不同的错误代码。0应该用于成功,所以您可以返回1;指示失败。我可以建议添加一些代码来帮助您发现文件何时无法正确打开吗?您可以打印一个日志行,或者返回一个不同的错误代码。0应该用于成功,所以您可以返回1;表示失败。