将两个文本文件合并为一个会给出不同的输出

Merging two text files to one gives a different output

本文关键字:输出 一个 两个 文本 文件 合并      更新时间:2023-10-16

其中一个文本文件是rainfallToDate.txt,它具有:

0.01
1.74
0.19
0.65
0.50
0.10
0.00
0.02
0.01
0.06
1.57
7.76

而另一个是平均降雨量.txt:

2.99
3.32
2.04
1.06
0.39
0.09
0.00
0.00
0.23
0.78
1.88
2.12

我应该将这两个文本文件合并到一个名为 rainfall 的文本文件中.txt

下面是一个示例输出:

Rainfall for Cupertino: A Comparison
Month    Average    2015    
1        2.99       0.01        
2        3.32       1.74      
3        2.04       0.19      
4        1.06       0.65       
5        0.39       0.50     
6        0.09       0.10      
7        0.00       0.00      
8        0.00       0.02      
9        0.23       0.01      
10       0.78       0.06      
11       1.88       1.57     
12       2.12       7.76     

如您所见,averageRainfall.txt存储在"average"行中,而另一个文本文件rainfallToDate.txt存储在2015年下。

好吧,这就是我到目前为止所拥有的以及我尝试"合并"两个文本文件的尝试。

我的尝试:

#include <iostream>  // for cout
#include <fstream>   // for file I/O
#include <cstdlib>   // for exit()
using namespace std;
int main()
{
ifstream fin;
ofstream fout;
if (fin.fail())
{
    cout << "Input file failed to open.n";
    exit(-1);
}
fout.open("rainfall.txt");
if (fout.fail())
{
    cout << "Output file failed to open.n";
    exit(-1);
}
fout << "Rainfall for Cupertino: A Comparisonn" << endl;
fout << "MonthtAveraget 2015tDeficitn" << endl;
   for (int i = 1; i <= 12; i++) { // counts the month from 1-12
    fout << fixed << i <<  endl;
}
fin.close();
fout.close();

// averageRainfall under averages
ifstream average;
ofstream oaverage;
average.open("averageRainfall.txt");
if (average.fail())
{
    cout << "Input file failed to open.n";
    exit(-1);
}
oaverage.open("rainfall.txt");
if (fout.fail())
{
    cout << "Output file failed to open.n";
    exit(-1);
}
oaverage << "t" << average;

// rainfallToDate under 2015
average.close();
oaverage.close();
ifstream ToDate;
ofstream oToDate;
ToDate.open("rainfallToDate.txt");
if (ToDate.fail())
{
    cout << "Input file failed to open.n";
    exit(-1);
}
oToDate.open("rainfall.txt");
if (oToDate.fail())
{
    cout << "Output file failed to open.n";
    exit(-1);
}
oToDate << "t" << "t" << ToDate;
ToDate.close();
oToDate.close();
return 0;
}

现在对于问题,代码运行并且所有代码都没有说明任何类型的错误,但是,当我打开两个代码合并文件打印出来的文件时

0x29fe64

我认为我做错了的是我没有将两个文本文件"平均值"和"降雨日期"放入两个单独的数组中并从那里说明它。如果我错了,请纠正我,不太确定我是否应该将它们放在两个单独的数组中。

oToDate << "t" << "t" << ToDate;

我猜你在这里的目的是将所有内容从ToDate流复制到oToDate流,但事实并非如此。相反,这只是尝试写出一个表示ToDate的值 - 结果证明是变量的(无意义的)指针地址。

但是,即使我们解决了这个问题,我们目前也无法完全按照您的要求进行操作。看起来您正在尝试首先复制平均降雨量数据,然后在第二遍中,跳过您刚刚编写的内容并将降雨量放在旁边。但这行不通 - 第二遍只会覆盖现有行。

相反,您需要做的是加载两个数据集,并一次性将它们写出来。一种选择是分别加载两个数据集,并在写回值之前使用std::vector来保存这些值。让我们看看如何做到这一点:

std::ifstream average{"averageRainfall.txt"};
std::vector<double> average_data;
std::copy(std::istream_iterator<double>{average},
          std::istream_iterator<double>{},
          std::back_inserter(average_data));

这会将所有数据从输入文件复制到一个向量中(如果您以前没有见过这些函数,请确保查找它们,以便您知道这里发生了什么!我们可以对第二个数据集做完全相同的事情,所以假设我们将其保存到一个名为 to_date_data 的向量中。

然后,我们需要同时将这两个值写入文件。首先,我们打开输出文件:

std::ofstream rainfall{"rainfall.txt"};

然后我们遍历两个向量,将数据复制到输出流:

auto last = std::min(average_data.size(), to_date_data.size());
for (int i = 0; i < last; i++) {
    rainfall << average_data[i] << "t" << to_date_data[i] << "n";
}

你都完成了:-)

你奇怪的输出来自这一行:

oaverage << "t" << average;

average是流,而不是数值。 当您尝试打印流时,流最终会转换为指针,并且您看到的是指针值。

这一行有一个类似的问题:

oToDate << "t" << "t" << ToDate;

也许你应该读一些基本的C++编程书,这是我的代码:

#include <iostream>  // for cout
#include <fstream>   // for file I/O
#include <cstdlib>   // for exit()
using namespace std;
int main()
{
  std::ifstream fin_rain_date("rainfallToDate.txt");
  std::ifstream fin_rain_ave("averageRainfall.txt");
  if(fin_rain_ave==NULL||fin_rain_date==NULL)
  {
    std::cout<<"can not open file"<<std::endl;
  }
  std::ofstream fout("rainfall.txt");
  fout<<"Rainfall for Cupertino: A Comparison"<<std::endl;
  fout<<"MonthtAveraget 2015tDeficit"<<std::endl;
  for(int i=0;i<12;i++)
  {
    fout<<i<<"t";
    char tmpstr[256];
    fin_rain_ave.getline(tmpstr,256);
    fout<<tmpstr<<"t";
    fin_rain_date.getline(tmpstr,256);
    fout<<tmpstr<<std::endl;
  }
  return 0;
}