写入输出文件的 C++ 星形菱形图案变得混乱
C++ Star diamond pattern written to output file becomes jumbled
我正在学习用 C++ 编写代码并进行简单的初学者练习。目前,我遇到一个问题,即我的星形菱形图案输出正确到控制台,但 相同的文件输出变得混乱。
此程序根据行长创建 a * star diamond,并尝试将相同的设计保存到名为 output_diamond.txt
.[=14= 的输出文件中]
关于如何处理此类问题的任何提示或解决方案?我知道 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
}
控制台输出
*
***
*****
*******
*********
***********
*************
***************
*************
***********
*********
*******
*****
***
*
示例文本文件输出
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
您的 cout
和 fout
行应始终成对出现并且应始终相同。
// Output to console a single *
cout << '*';
fout << '*' << endl;
去掉 << endl
。这发生在两个地方。
// Before for loop ends output end of line
cout << endl;
添加fout << endl;
。这也发生了两次。
实用的解决方案是采用可行的方法并将其推广。有效的是 std::cout
生成的输出,因此所需要的只是编写一个函数,它接受一个流并完全执行 std::cout
正在做的事情。
做到这一点的方法是认识到 std::ostream
是输出流的基础 class,因此所需要的只是使用多态性并编写一个函数来引用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++;
}
}
Live Example showing std::cout and std::ostringstream
这是文件的输出:
*
***
*****
*******
*********
***********
*************
***************
*************
***********
*********
*******
*****
***
*
我正在学习用 C++ 编写代码并进行简单的初学者练习。目前,我遇到一个问题,即我的星形菱形图案输出正确到控制台,但 相同的文件输出变得混乱。
此程序根据行长创建 a * star diamond,并尝试将相同的设计保存到名为 output_diamond.txt
.[=14= 的输出文件中]
关于如何处理此类问题的任何提示或解决方案?我知道 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
}
控制台输出
*
***
*****
*******
*********
***********
*************
***************
*************
***********
*********
*******
*****
***
*
示例文本文件输出
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
您的 cout
和 fout
行应始终成对出现并且应始终相同。
// Output to console a single *
cout << '*';
fout << '*' << endl;
去掉 << endl
。这发生在两个地方。
// Before for loop ends output end of line
cout << endl;
添加fout << endl;
。这也发生了两次。
实用的解决方案是采用可行的方法并将其推广。有效的是 std::cout
生成的输出,因此所需要的只是编写一个函数,它接受一个流并完全执行 std::cout
正在做的事情。
做到这一点的方法是认识到 std::ostream
是输出流的基础 class,因此所需要的只是使用多态性并编写一个函数来引用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++;
}
}
Live Example showing std::cout and std::ostringstream
这是文件的输出:
*
***
*****
*******
*********
***********
*************
***************
*************
***********
*********
*******
*****
***
*