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

时间:2016-03-19 04:55:56

标签: c++

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

<div class=container>
<div class=bubble></div><div class=bright></div>
</div>

而另一个是averageRainfall.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

我应该将这两个文本文件合并到一个名为 rainfall.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

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

这就是我到目前为止所做的以及我尝试“合并”两个文本文件。

我的尝试:

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     

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

#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 Comparison\n" << endl;
fout << "Month\tAverage\t 2015\tDeficit\n" << 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;
}

我认为我做错了是我没有把两个文本文件“averages”和“raintodate”分成两个独立的数组并从那里说明。纠正我,如果我错了不太确定我是否应该将两个放在两个独立的阵列中。

3 个答案:

答案 0 :(得分:1)

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

你们都完成了: - )

答案 1 :(得分:0)

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

oaverage << "\t" << average;

average是一个流,而不是数值。当您尝试打印流时,流最终会转换为指针,而您正在看到指针值。

这一行有类似的问题:

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

答案 2 :(得分:0)

也许你应该阅读一些基本的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<<"Month\tAverage\t 2015\tDeficit"<<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;
}