其中一个文本文件是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”分成两个独立的数组并从那里说明。纠正我,如果我错了不太确定我是否应该将两个放在两个独立的阵列中。
答案 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;
}