Ввод в файлы и вывод в другой файл и передача потоковых файлов в функции - PullRequest
0 голосов
/ 25 февраля 2020

Предлог: Я новичок в кодировании 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 и StackOverflow. Спасибо за помощь. Также ниже приводится версия без каких-либо файлов.

#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);
}

1 Ответ

0 голосов
/ 25 февраля 2020

В вашем описании проблемы это звучит так, как будто версия, транслируемая на 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';
}
...