С ++ проблемы чтения входного файла и вывода в выходной файл с помощью getline () - PullRequest
0 голосов
/ 16 марта 2019

У меня есть это назначение для вводного класса C ++, и я не понимаю, почему мой getline, кажется, работает, но он не выводит мои функции в outfile.txt. Мой учитель сказал, что мой синтаксис getline неправильный, ноЯ в замешательстве относительно того, как.Мой infile.txt читает:

T & 4
S @ 6
T x 5
R * 5 7
D $ 7
D + 5
R = 4 3
E

И мой код:

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;


void draw_rect (char out_char, int rows, int columns); // Draws a rectangle shape

void draw_square (char out_char, int rows); //Draws a square shape

void draw_triangle (char out_char, int rows);// Draws a triangle shape

void draw_diamond (char out_char, int rows); // Draws a diamond shape

int main()
{
    ofstream outfile;
    ifstream infile;
    int row, col;
    bool exit = false;
    char value;
    infile.open("infile.txt");
    outfile.open("outfile.txt");
    if(!infile.good())
    {
        cout << "failed to open\n";
    }else
    {
        string buffer;
        while(!infile.eof() || !exit)
        {
            getline(infile, buffer);
                switch(buffer[0])
                {
                case 'R':
                   value = buffer[2];
                   row = buffer[4];
                   col = buffer[6];
                   draw_rect(value, row, col);
                   break;
                case 'T':
                    value = buffer[2];
                    row = buffer [4];
                    draw_triangle(value, row);
                    break;
                case 'D':
                    value = buffer[2];
                    row = buffer[4];
                    draw_diamond(value, row);
                    break;
                case 'S':
                    value = buffer[2];
                    row = buffer[4];
                    draw_square(value, row);
                    break;
                case 'E':
                    cout << "Files Written.\nExiting." << endl;
                    exit = true;
                    break;
                default:
                    cout << "Invalid input, try again" << endl;
                }
        }
    }
    return  0;

}

void draw_diamond (char out_char, int rows)
{
    ofstream outfile;
    int space = 1;
    space = rows - 1;
    for (int i = 1; i <= rows; i++)
    {
        for (int k = 1; k <= space; k++)
        {
            outfile << " ";
        }
        space--;
        for( int k = 1; k <= 2*i-1; k++)
        {
            outfile << out_char;
        }
        outfile << endl;
    }
    space = 1;
    for (int i = 1; i <= rows; i++)
    {
       for(int k = 1; k <= space; k++)
       {
           outfile << " ";
       }
       space++;
       for(int k = 1; k <= 2*(rows-i)-1; k++)
       {
           outfile << out_char;
       }
       outfile << endl;
    }
}

void draw_triangle (char out_char, int rows)
{
    ofstream outfile;
     for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j <= i; j++)
        {
            outfile << out_char;
        }
        outfile << endl;
}
}

void draw_square (char out_char, int rows)
{
    ofstream outfile;
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < rows; j++)
        {
            outfile << out_char;
        }
        outfile << endl;
    }
}

void draw_rect (char out_char, int rows, int columns)
{
    ofstream outfile;
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < columns; j++)
        {
            outfile << out_char;
        }
        outfile << endl;
    }
}

1 Ответ

3 голосов
/ 16 марта 2019

Используя одну из ваших функций в качестве примера:

void draw_rect (char out_char, int rows, int columns)
{
    ofstream outfile;

Это объявляет новый объект std::ofstream в вашей функции draw_rect().draw_rect() не открывает этот std::ofstream объект, поэтому попытки draw_rect () что-либо записать в этот outfile абсолютно ничего не делают.

Тот факт, что вы создали std::ofstream объектс тем же именем в вашем main(), которое вы открыли, абсолютно ничего не значит.Тот факт, что у вас один и тот же объект с одинаковым именем в разных функциях, не означает, что это один и тот же объект.C ++ не работает таким образом.

Вам нужно изменить функцию main(), чтобы она передавала outfile в каждую функцию, по ссылке, в качестве параметра, вместо того, чтобы объявлять другой объект с тем же именем в каждомфункция.Вышеприведенная функция будет, например:

void draw_rect (ofstream &outfile, char out_char, int rows, int columns)
{

. Вам нужно будет изменить каждую из ваших функций, чтобы получить параметр outfile по ссылке, например, изменить их предварительные объявления и явно передать outfile в качестве первого параметра из main(), в каждом вызове функции.

Наконец, относительно вашего заявления о том, что ваш учитель сказал вам, что что-то не так с вашим использованием getline:

Вы были полностью оправданы своим замешательством.Если ваш «синтаксис getline неверен», вы получите ошибку компиляции.Поскольку в вашем вопросе не упоминались какие-либо ошибки компиляции, даже до исследования и определения фактической проблемы можно было разумно заключить, что: 1) синтаксис getline был правильным, 2) программа скомпилирована и 3) вам нужно найти лучшийучитель, если ты намерен на самом деле выучить C ++ без помех со стороны плохих инструкторов.

Судя по всему, твоя проблема не имеет ничего общего с getline.Ваш учитель был просто некомпетентен и мало что знает о C ++.Конечно, это не ваша вина, но вы должны это понимать.

PS:

while(!infile.eof() || !exit)

Это небольшая ошибка .В этом случае ошибка скрыта, потому что в конечном итоге exit будет корректно установлено с вашим вводным примером, но вы должны исправить это после прочтения и понимания объяснения, приведенного по этой ссылке.

...