我正在学习用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
}
控制台输出
*
***
*****
*******
*********
***********
*************
***************
*************
***********
*********
*******
*****
***
*
示例文本文件输出
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
答案 0 :(得分:2)
您的cout
和fout
行应始终成对出现,并且应始终相同。
// Output to console a single *
cout << '*';
fout << '*' << endl;
摆脱<< endl
。这发生在两个地方。
// Before for loop ends output end of line
cout << endl;
添加fout << endl;
。这也会发生两次。
答案 1 :(得分:2)
实际的解决方案是采用可行的方法并将其概括。有效的是row.original
生成的输出,因此所需要做的就是编写一个函数,该函数接受流并完全执行std::cout
所做的事情。
这样做的方法是认识到std::cout
是输出流的基类,因此,所需要做的就是使用多态性并编写一个引用std::ostream
的函数。
这里是一个例子:
std::ostream
Live Example showing std::cout and std::ostringstream
这是文件的输出:
#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++;
}
}