getline()函数在while循环中不起作用

时间:2019-03-19 04:00:51

标签: c++ fstream file-handling

当我使用“ getline()”函数而没有任何循环时,我想使用外部类“ File_Opening_and_Closing.cpp”创建一个简单的文件输入输出程序,它工作正常,但是当我使用“ getline”时()”函数“ ”和“ main.cpp”中的do while循环会崩溃。

请告诉我问题出在哪里以及如何解决?

  

main.cpp

    #include<iostream>
    #include<fstream>
    #include "File_Opening_and_Closing.h" using namespace std;

    int main() {
        int i=1;
        char file_make='y';
        char file_insert='y';

        do
        {
            File_Opening_and_Closing file[i];

            do
            {
                file[i].put_data();
                file[i].show_data();
                cout<<"Do you want to insert text again ? 'y' OR 'n'"<<endl;
                cin>>file_insert;
            }while(file_make=='y');
            i++;
            cout<<"Do you want to Make another file ? 'y' OR 'n'"<<endl;
            cin>>file_make;
        }while(file_insert=='y');

return 0;}
  

无循环工作正常>>

 int main() {
            File_Opening_and_Closing file;
            file.put_data();
            file.show_data();
 return 0;}
  

File_Opening_and_Closing.cpp

#include "File_Opening_and_Closing.h"

File_Opening_and_Closing::File_Opening_and_Closing()
{
    cout<<"Enter the file name and type => ";
    cin>>file_name;
}

void File_Opening_and_Closing::put_data(){
    ofstream file_out;
    file_out.open(file_name);

    cin.ignore();
    cout<<"Enter the string => ";
    cin.ignore();

//  getline is not working here!

    getline(cin,data);

    data = "Hello World!";

    file_out<<data;
    file_out.close();
}

void File_Opening_and_Closing::show_data(){
    ifstream file_in;

    file_in.open(file_name);

    getline(file_in,data);
    cout<<data;

    file_in.close();
}
  

File_Opening_and_Closing.h

#ifndef FILE_OPENING_AND_CLOSING_H
#define FILE_OPENING_AND_CLOSING_H
#include<iostream>
#include<fstream>
using namespace std;


class File_Opening_and_Closing
{
    private:
        string file_name;
        string data;
    public:
        File_Opening_and_Closing();
        void put_data();
        void show_data();
    protected:
};

#endif // FILE_OPENING_AND_CLOSING_H

Problem picture

1 个答案:

答案 0 :(得分:1)

您有很多问题,尤其是How to debug small programs问题,其中您混淆了用于测试两个do .. while (...);循环的变量,例如

            ...
            cin>>file_insert;
        }while(file_make=='y');
        // i++; (not needed and VLA's not allowed in C++
        cout<<"Do you want to Make another file ? 'y' OR 'n'"<<endl;
        cin>>file_make;
    }while(file_insert=='y');

第二,如注释中所述,标准C ++不允许使用可变长度数组

    File_Opening_and_Closing file[i];

如果您需要一个以上的类实例,请使用类的向量或类的数组。但是,您的代码都不需要。由于您通过File_Opening_and_Closing循环的每次迭代都创建了do { ... } while (..);的新实例,因此您可以简单地使用:

    File_Opening_and_Closing file;

您通过将file_makefile_insert声明为char类型,使事情变得难以置信。相反,只需将它们设置为std::string并进行测试,例如if (file_make == "y")。这样一来,您可以使用getline读取所有输入内容,从而避免了std::cingetline混合使用时出现的问题。

剩下的问题是完全无法通过以下方式验证文件的开头: if (!file_out.is_open()) { /* handle error */ }的每个输入都需要进行类似的测试,以确保您可以通过用户使用 Ctrl + d (或 Ctrl + z (在Windows上)。

此外,避免将EOF放在头文件中。无需使用标头将标准名称空间拖入每个文件中(尽管您确实做了出色的工作,并使用标头保护using namespace std;来防止包含多个文件)。实际上,这里根本没有理由使用FILE_OPENING_AND_CLOSING_H。只需使用using namespace std;的{​​{1}}命名空间解析运算符,等等。

让验证添加以便您解决其他问题,您可以执行以下操作:

File_Opening_and_Closing.h

std::

File_Opening_and_Closing.cpp

cin, cout

main.cpp

#ifndef FILE_OPENING_AND_CLOSING_H
#define FILE_OPENING_AND_CLOSING_H

#include<iostream>
#include<fstream>

class File_Opening_and_Closing
{
    private:
        std::string file_name;
        std::string data;
    public:
        File_Opening_and_Closing();
        void put_data();
        void show_data();
    protected:
};

#endif

现在它将创建所需数量的文件(尽管如果要添加多个字符串,则需要进入#include "File_Opening_and_Closing.h" File_Opening_and_Closing::File_Opening_and_Closing() { std::cout << "Enter the file name and type => "; getline (std::cin, file_name); } void File_Opening_and_Closing::put_data(){ std::ofstream file_out; file_out.open(file_name); std::cout<<"Enter the string => "; getline (std::cin, data); file_out << data << '\n'; file_out.close(); } void File_Opening_and_Closing::show_data(){ std::ifstream file_in; file_in.open (file_name); getline (file_in,data); std::cout << data << '\n'; file_in.close(); } 模式。

使用/输出示例

#include<iostream>
#include<fstream>

#include "File_Opening_and_Closing.h"

int main (void) {

    std::string file_make = "y";
    std::string file_insert = "y";

    do
    {
        File_Opening_and_Closing file;

        do
        {
            file.put_data();
            file.show_data();
            std::cout << "Do you want to insert text again ? 'y' OR 'n'\n";
            getline (std::cin, file_insert);
        } while (file_insert == "y");
        std::cout << "Do you want to Make another file ? 'y' OR 'n'\n";
        getline (std::cin, file_make);
    } while (file_make == "y");

    return 0;
}

生成的输出文件

std::ios::app

如果您还有其他问题,请告诉我。