【问题标题】:Reading multiple .txt files c++ linux读取多个.txt文件c ++ linux
【发布时间】:2023-03-22 13:19:01
【问题描述】:

我正在尝试读取多个 .txt 文件并将每个文本中的每一行 push_back 到字符串类型的向量。 因此:第一个文件有 200 行。 第二个文件有 800 行。

但是,我在读取第二个文件之前遇到了问题。

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <vector>

using namespace std;


struct data
{
  string from_file_1;
  string from_file_;
};

int main()
{
data my_data;
string file_1="file1.txt";
string file_2="file2.txt";

ifstream file_one(file_1.c_str);
ifstream file_two(file_2.c_str);

Vector<data> mydata;
int  max_chars_per_line=100000;
    while(!file_one.eof()&&!file_two.eof())
    {
            char buf[max_chars_per_line];
            file_one.getline(buf, max_chars_per_line);
            string str(buf);

            char buf2[max_chars_per_line];
            file_two.getline(buf2, max_chars_per_line);
            string str2(buf2);

           my_data.from_file_1=str;
           my_data.from_file_2=str2;

           mydata.push_back(my_data);
    }
//when loop exits, the size of the vector ,mydata, should be greater than 200+, but doesn't work .
return 0;
}

感谢您抽出宝贵时间帮助我。

【问题讨论】:

    标签: c++ linux fstream


    【解决方案1】:

    您需要从 either 文件中检查 end-of-file,检测文件结束的最佳方法是检查 getline() 的结果.此代码还直接读入data 的实例变量,而不是使用中间字符缓冲区。

    Vector<data> mydata;
    data data;
    while (getline(file_one, data.from_file_1) &&
           getline(file_two, data.from_file_2))
    {
        mydata.push_back(data);
    }
    

    【讨论】:

      【解决方案2】:

      改变

      while(!file_one.eof()&&!file_two.eof())
      

      while(!file_one.eof() || !file_two.eof())
      

      您需要在读取每个文件之前检查文件结尾,如果没有要读取的内容,请确保您的 str1 和 str2 为空

      【讨论】:

      • 但是eof()不会只返回true之后检测到文件结尾,所以最后一行可能出现读取错误?
      • 检查 eof() 并没有像其他人指出的那样做你所期望的。
      【解决方案3】:

      您需要修正您的条件,因为您的条件是“AND”,所以当第一个文件结束时,根本不会添加第二个文件的行。

      你为什么不使用一个向量来放置你读过的所有行? 通过这种方式,您可以轻松拆分阅读阶段。您将有两个 while 循环,每个文件一个,没有任何其他问题。每隔一段时间,您都会对单个向量 my_data 执行此类操作:

      while(!curr_file.fail()) {
          char buf[max_chars_per_line];
          file_one.getline(buf, max_chars_per_line);
          string str(buf);
          my_data.push_back(buf);
      }
      

      【讨论】:

        【解决方案4】:

        您不应该检查eof(),因为在读取发生之前不会设置此标志。另一件事是使用std::getline() 更容易,因为它适用于std::strings 而不是原始字符缓冲区。而且你不需要所有的两个,如果你愿意,你可以重复使用std::ifstream

        另外我不确定是否真的需要成对存储这些行?毕竟文件的长度不同。

        也许这样的事情会有所帮助:

        // file names
        string file_1="file1.txt";
        string file_2="file2.txt";
        
        // vector to store the lines from the files
        std::vector<std::string> my_data;
        
        ifstream file;
        
        std::string line; // working variable for input
        
        file.open(file_1.c_str()); // open first file
        
        while(std::getline(file, line)) // while reading one line is successful
               mydata.push_back(line);
        
        file.close();
        
        // now do the same with the second file
        
        file.open(file_2.c_str());
        
        while(std::getline(file, line))
               mydata.push_back(line);
        
        file.close();
        

        这会将第一个文件中的所有行放入向量中,然后将第二个文件中的所有行放入向量中。安排与您的不同,因此如果不合适,请检查我如何阅读这些台词并将该信息用于您的目的。

        【讨论】:

          猜你喜欢
          • 2019-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多