将两个文本文件合并为一个会给出不同的输出
Merging two text files to one gives a different output
其中一个文本文件是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;
}
- 以C++输出一个数字三角形
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- 输出一个数字,该数字可能是三种类型之一
- 为什么我的数组输出一个不在其中的元素
- C++可以输出一个结构的内存地址吗
- C 如何输出一个在函数中操纵的数组
- 每次循环时,输出一个具有较小字符的字符阵列
- 输出一个15位数字
- 对于每个单词输出一个对列表,行号和该行的字数
- 如何从字符串中每行输出一个单词
- 控制台程序读取文本文件行,做Levenstein并输出一个文本文件
- C++使用类从多维向量输出一个char数组
- 为什么我的程序输出一个巨大的小数
- 用c++编写一个程序,输出一个矩阵,如下所示
- 在C++中输出一个ofstream的filebuf*做什么
- C++ 仅输出一个小数点后一位
- 曼德布洛特集合输出一个点
- 输出一个三角形
- 输入/输出一个对象向量
- 输出一个c++文件作为另一个c++文件的输入