c++ - 写入输出文件的 C++ 星形菱形图案变得混乱
问题描述
我正在学习用 C++ 编写代码并进行简单的初学者练习。目前,我面临一个问题,我的星形菱形图案输出正确到控制台,但是到文件的相同输出变得混乱。
该程序根据行长创建* 星形菱形,并尝试将相同的设计保存到名为output_diamond.txt
.
有关如何处理此类问题的任何提示或解决方案?我知道 C++ 部分非常严格,我确保记录我的代码并提供一个可工作的可重新创建的示例。
代码
#include <iostream>
#include <string>
#include <fstream>
#include <cassert>
using namespace std;
void pyramid(int rows);
int main() {
pyramid(8);
return 0;
}
/*
* @param int rows
*
* Function to output to console a star pyramid
* based on an amount of rows for a half going
* vertical. If top half of rows is 8, than the
* bottom half will be indetical but reverse with
* a row count of 8.
*/
void pyramid(int rows) {
ofstream fout;
fout.open("output_diamond.txt");
if (fout.is_open()) {
/* Top Half */
// Initialize variable for spaces equal to (rows - 1)
int space = rows - 1;
// Begin first for loop for top half of diamond
for (int i = 1; i <= rows; i++) { // For 1
// Begin for loop for spaces
for (int count = 1; count <= space; count++) { // For 2
// Output to console a single space
cout << ' ';
fout << " ";
} // End For 2
// Begin for loop for star/diamond char symbol
for (int count = 1; count <= (2 * i) - 1; count++) { // For 3
// Output to console a single *
cout << '*';
fout << '*' << endl;
} // End For 3
// Before for loop ends output end of line
cout << endl;
// Decrement -1 to space
space--;
} // End For 1
/* Bottom Half */
// Set value for space variable to 1
space = 1;
// Begin first for loop for bottom half of diamond
for (int i = 1; i <= rows - 1; i++) { // For 1
// Begin loop for spaces
for (int count = 1; count <= space; count++) { // For 2
// Output to console a single space
cout << ' ';
fout << ' ';
} // End For 2
// Begin for loop for star/diamond char symbol
for (int count = 1; count <= (2 * (rows - i)) - 1; count++) { // For 3
// Output to console a single *
cout << '*';
fout << '*' << endl;
} // End For 3
// Before for loop ends output end of line
cout << endl;
// Increment space +1
space++;
} // End For 1
} else {
cout << "Output file did not open!" << endl;
assert(fout);
}
// End
}
控制台输出
*
***
*****
*******
*********
***********
*************
***************
*************
***********
*********
*******
*****
***
*
示例文本文件输出
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
解决方案
实际的解决方案是采用有效的方法并将其推广。起作用的是由 生成的输出std::cout
,因此所需要做的就是编写一个函数,该函数接受一个流并完全std::cout
执行正在执行的操作。
做到这一点的方法是实现它std::ostream
是输出流的基类,因此所需要做的就是使用多态性并编写一个引用 a 的函数std::ostream
。
这是一个例子:
#include <iostream>
#include <string>
#include <ostream>
#include <fstream>
#include <sstream>
#include <cassert>
using namespace std;
void pyramid(int rows, std::ostream& );
int main()
{
// use regular cout
std::cout << "Using cout \n\n";
pyramid(8, std::cout);
// try file printing
std::ofstream fout;
fout.open("output_diamond.txt");
pyramid(8, fout);
// try printing to a string stream
std::cout << "\n\nUsing ostringstream \n\n";
std::ostringstream ostrm;
pyramid(8, ostrm);
std::cout << "\n";
std::cout << ostrm.str();
return 0;
}
void pyramid(int rows, std::ostream& sout)
{
int space = rows - 1;
for (int i = 1; i <= rows; i++) {
for (int count = 1; count <= space; count++) {
sout << ' ';
}
for (int count = 1; count <= (2 * i) - 1; count++) {
sout << '*';
}
sout << endl;
space--;
}
space = 1;
for (int i = 1; i <= rows - 1; i++) {
for (int count = 1; count <= space; count++) {
sout << ' ';
}
for (int count = 1; count <= (2 * (rows - i)) - 1; count++) {
sout << '*';
}
sout << endl;
space++;
}
}
显示 std::cout 和 std::ostringstream 的实时示例
这是文件的输出:
*
***
*****
*******
*********
***********
*************
***************
*************
***********
*********
*******
*****
***
*
推荐阅读
- javascript - 有没有办法使用带有 HTML 的 JavaScript 来上传附加到 HTML 生成的电子邮件的文件?
- ios - 如何在codemagic中创建podfile?
- python - Prob 使用轴进行子图获取 AttributeError:'numpy.ndarray' 对象没有属性'plot'
- c# - NET Core 3.1 worker 中带有 Serilog 的哨兵
- php - PHP:使用 file_get_contents 访问 API - 空响应
- parsing - 如何在 DCG 中表示字母数字字符串?
- passbook - 苹果钱包里如何不把卡片叠在一起?
- node.js - Smartsheet 避免节点中的无限循环
- nextflow - 从通道扩展路径
- flutter - Flutter - 找不到正确的提供者