输入文件并输出到另一个文件并将流文件传递给函数
Inputting into files and outputting to another file and passing ofstream files to functions
Pretext: 我是 c++ 编码新手,知道数组和字符串。这位教授展示了如何输入和输出到文件中,并给了我们以下作业。
作业题:在文件中输入一个数字。现在想象有一个楼梯,上面有输入的步数。您可以提高一级并用 'u' 表示,也可以提高两级并用 'd' 表示。找到该类型的所有可能组合并将它们写入文件。
示例: 对于 n=1,输出应为 'u';对于 n=2,输出应该是 'uu d';对于 n=3,输出应该是 'uuu ud du' 等等。
我的思考过程: 所以这基本上是一个斐波那契数列。所以就像斐波那契数列一样,我想到了一个递归算法。这是我想出的...
代码
#include<iostream>
#include<fstream>
using namespace std;
void staircase(int num, int count, char* c, int index, ofstream &file)
{
char c1[num], c2[num];
for (int i = 0;i < num;i++) {
c1[i] = c[i];
c2[i] = c[i];
}
if (num - count == 2) {
c1[index] = 'd';
c2[index] = 'u';
c2[index + 1] = 'u';
file.open("output.txt", ios::app);
file << c1 <<" ";
file << c2 <<" ";
file.close();
return;
}
if (num - count == 1) {
c2[index] = 'u';
file.open("output.txt", ios::app);
file << c2 <<" ";
file.close();
return;
}
if (num - count > 2) {
c1[index] = 'd';
c2[index] = 'u';
staircase(num, count + 2, c1, index+1,file);
staircase(num, count + 1, c2, index+1,file);
}
}
int main(){
int num;
cout<<"Input total number of stairs: ";
cin>>num;
fstream myfile;
myfile.open("input.txt");
myfile<<num;
myfile.close();
cout<<"Input is saved in file Directory ";
char c[num];
ofstream file;
file.open("output.txt");
staircase(num, 0, c, 0, file);
}
问题: 当我在没有文件代码的情况下编写它时,它一切正常,命令提示符显示了所有可能的输出。我还注意到 n=1 和 n=2 它甚至没有在文件上打印任何内容。我觉得我在 fstream 中遗漏了一些东西,无法指出。我试图搜索 google 和 Whosebug。谢谢你帮助我。另外下面是没有任何文件的版本。
#include<iostream>
#include<fstream>
using namespace std;
void staircase(int num, int count, char* c, int index)
{
char c1[num], c2[num];
for (int i = 0;i < num;i++) {
c1[i] = c[i];
c2[i] = c[i];
}
if (num - count == 2) {
c1[index] = 'd';
c2[index] = 'u';
c2[index + 1] = 'u';
for(int i=0;i<=index;i++)
cout<<c1[i];
cout<<" ";
for(int i=0;i<=index+1;i++)
cout<<c2[i];
cout<<" ";
return;
}
if (num - count == 1) {
c2[index] = 'u';
for(int i=0;i<index+1;i++)
cout<<c2[i];
cout<<" ";
return;
}
if (num - count > 2) {
c1[index] = 'd';
c2[index] = 'u';
staircase(num, count + 2, c1, index+1);
staircase(num, count + 1, c2, index+1);
}
}
int main(){
int num;
cout<<"Input total number of stairs: ";
cin>>num;
cout<<"Input is saved in file Directory ";
char c[num];
staircase(num, 0, c, 0);
}
在您对问题的描述中,流式传输到 std::cout
的版本似乎正确地完成了工作。在这种情况下,只需将参数添加到 staircase
并使用 std::ostream&
并将函数中各处的 cout
替换为 ostream
参数。这样你就可以流式传输到 std::cout
并打开 std::ofstream
s.
如果您想继续使用标准 C++,请不要使用 VLA:s - 请改用 std::vector<>
。它有很多不错的功能,例如一个名为 size()
的成员函数,您可以使用它而不必将 num
作为单独的参数与 VLA 一起传递。
示例:
#include <cstddef>
#include <fstream>
#include <iostream>
#include <vector>
// When using a vector, you don't need to pass in "num". The vector
// has a size() function that returns how many enements it contains.
// Also note the added std::ostream parameter for streaming to any ostream.
void staircase(size_t count, const std::vector<char>& c, size_t index, std::ostream& os)
{
std::vector<char> c1 = c; // create a copy of c instead of manual looping
std::vector<char> c2 = c; // create a copy of c instead of manual looping
if(c.size() - count == 2) {
c1[index] = 'd';
c2[index] = 'u';
c2[index + 1] = 'u';
for(size_t i = 0; i <= index; ++i) os << c1[i];
os << ' ';
for(size_t i = 0; i <= index + 1; ++i) os << c2[i];
os << ' ';
return;
}
if(c.size() - count == 1) {
c2[index] = 'u';
for(size_t i = 0; i < index + 1; ++i) os << c2[i];
os << ' ';
return;
}
if(c.size() - count > 2) {
c1[index] = 'd';
c2[index] = 'u';
staircase(count + 2, c1, index + 1, os);
staircase(count + 1, c2, index + 1, os);
}
}
int main() {
size_t num;
std::cout << "Input total number of stairs: ";
std::cin >> num;
// use a vector instead of a VLA:
std::vector<char> c(num, 0);
// Just call staircase with an open file instead of std::cout
// if you want the output to a file.
staircase(0, c, 0, std::cout);
std::cout << '\n';
}
Pretext: 我是 c++ 编码新手,知道数组和字符串。这位教授展示了如何输入和输出到文件中,并给了我们以下作业。
作业题:在文件中输入一个数字。现在想象有一个楼梯,上面有输入的步数。您可以提高一级并用 'u' 表示,也可以提高两级并用 'd' 表示。找到该类型的所有可能组合并将它们写入文件。
示例: 对于 n=1,输出应为 'u';对于 n=2,输出应该是 'uu d';对于 n=3,输出应该是 'uuu ud du' 等等。
我的思考过程: 所以这基本上是一个斐波那契数列。所以就像斐波那契数列一样,我想到了一个递归算法。这是我想出的...
代码
#include<iostream>
#include<fstream>
using namespace std;
void staircase(int num, int count, char* c, int index, ofstream &file)
{
char c1[num], c2[num];
for (int i = 0;i < num;i++) {
c1[i] = c[i];
c2[i] = c[i];
}
if (num - count == 2) {
c1[index] = 'd';
c2[index] = 'u';
c2[index + 1] = 'u';
file.open("output.txt", ios::app);
file << c1 <<" ";
file << c2 <<" ";
file.close();
return;
}
if (num - count == 1) {
c2[index] = 'u';
file.open("output.txt", ios::app);
file << c2 <<" ";
file.close();
return;
}
if (num - count > 2) {
c1[index] = 'd';
c2[index] = 'u';
staircase(num, count + 2, c1, index+1,file);
staircase(num, count + 1, c2, index+1,file);
}
}
int main(){
int num;
cout<<"Input total number of stairs: ";
cin>>num;
fstream myfile;
myfile.open("input.txt");
myfile<<num;
myfile.close();
cout<<"Input is saved in file Directory ";
char c[num];
ofstream file;
file.open("output.txt");
staircase(num, 0, c, 0, file);
}
问题: 当我在没有文件代码的情况下编写它时,它一切正常,命令提示符显示了所有可能的输出。我还注意到 n=1 和 n=2 它甚至没有在文件上打印任何内容。我觉得我在 fstream 中遗漏了一些东西,无法指出。我试图搜索 google 和 Whosebug。谢谢你帮助我。另外下面是没有任何文件的版本。
#include<iostream>
#include<fstream>
using namespace std;
void staircase(int num, int count, char* c, int index)
{
char c1[num], c2[num];
for (int i = 0;i < num;i++) {
c1[i] = c[i];
c2[i] = c[i];
}
if (num - count == 2) {
c1[index] = 'd';
c2[index] = 'u';
c2[index + 1] = 'u';
for(int i=0;i<=index;i++)
cout<<c1[i];
cout<<" ";
for(int i=0;i<=index+1;i++)
cout<<c2[i];
cout<<" ";
return;
}
if (num - count == 1) {
c2[index] = 'u';
for(int i=0;i<index+1;i++)
cout<<c2[i];
cout<<" ";
return;
}
if (num - count > 2) {
c1[index] = 'd';
c2[index] = 'u';
staircase(num, count + 2, c1, index+1);
staircase(num, count + 1, c2, index+1);
}
}
int main(){
int num;
cout<<"Input total number of stairs: ";
cin>>num;
cout<<"Input is saved in file Directory ";
char c[num];
staircase(num, 0, c, 0);
}
在您对问题的描述中,流式传输到 std::cout
的版本似乎正确地完成了工作。在这种情况下,只需将参数添加到 staircase
并使用 std::ostream&
并将函数中各处的 cout
替换为 ostream
参数。这样你就可以流式传输到 std::cout
并打开 std::ofstream
s.
如果您想继续使用标准 C++,请不要使用 VLA:s - 请改用 std::vector<>
。它有很多不错的功能,例如一个名为 size()
的成员函数,您可以使用它而不必将 num
作为单独的参数与 VLA 一起传递。
示例:
#include <cstddef>
#include <fstream>
#include <iostream>
#include <vector>
// When using a vector, you don't need to pass in "num". The vector
// has a size() function that returns how many enements it contains.
// Also note the added std::ostream parameter for streaming to any ostream.
void staircase(size_t count, const std::vector<char>& c, size_t index, std::ostream& os)
{
std::vector<char> c1 = c; // create a copy of c instead of manual looping
std::vector<char> c2 = c; // create a copy of c instead of manual looping
if(c.size() - count == 2) {
c1[index] = 'd';
c2[index] = 'u';
c2[index + 1] = 'u';
for(size_t i = 0; i <= index; ++i) os << c1[i];
os << ' ';
for(size_t i = 0; i <= index + 1; ++i) os << c2[i];
os << ' ';
return;
}
if(c.size() - count == 1) {
c2[index] = 'u';
for(size_t i = 0; i < index + 1; ++i) os << c2[i];
os << ' ';
return;
}
if(c.size() - count > 2) {
c1[index] = 'd';
c2[index] = 'u';
staircase(count + 2, c1, index + 1, os);
staircase(count + 1, c2, index + 1, os);
}
}
int main() {
size_t num;
std::cout << "Input total number of stairs: ";
std::cin >> num;
// use a vector instead of a VLA:
std::vector<char> c(num, 0);
// Just call staircase with an open file instead of std::cout
// if you want the output to a file.
staircase(0, c, 0, std::cout);
std::cout << '\n';
}