C ++使用getline()读取输入文件并将其输出到输出文件时出现问题

时间:2019-03-16 01:47:01

标签: c++ file-io getline shapes

我为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 个答案:

答案 0 :(得分:3)

以您的一个功能为例:

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作为来自{{1}的第一个参数},在每个函数调用中。

最后,关于您的说法,即您的老师告诉您您使用main()出了点问题:

您完全有理由感到困惑。如果您的“ getline语法不正确”,则可能会导致编译失败。由于您的问题没有提到任何编译错误,因此即使在调查并确定实际问题之前,也可以合理地得出以下结论:1)getline语法正确,2)程序已编译,3)您需要找到更好的解决方案老师,如果您的目的是真正学习C ++而不受到不良指导老师的阻碍。

从所有方面来看,您的问题与getline无关。您的老师根本没有能力,对C ++的了解也不多。当然,那不是您的错,但是您需要了解这一点。

P.S。

getline

This is a small bug。在这种情况下,该错误将被隐藏,因为最终while(!infile.eof() || !exit) 会正确设置示例输入,但是您应该在阅读并理解此链接给出的解释后解决此问题。