getline() 函数在 while 循环中不起作用
getline() function is not working in while loop
我想用一个外部class“File_Opening_and_Closing.cpp”做一个简单的文件输入输出程序,当我使用“getline()”函数没有任何循环 它工作正常,但是当我在“main.cpp”中使用“getline ()”函数 with do while loop 时,它会崩溃。
请告诉我问题出在哪里,我是如何解决的?
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;}
with out loop working fine >>
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
你有一大堆问题,尤其是 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];
如果您需要 1 个以上的 class 实例,请使用 classes 向量或 classes 数组。但是,您的代码中都不需要。由于您通过 do { ... } while (..);
循环每次迭代都创建了 File_Opening_and_Closing
的新实例,因此您可以简单地使用:
File_Opening_and_Closing file;
通过将 file_make
和 file_insert
声明为 char
类型,您正在 给自己带来难以置信的困难 。相反,只需将它们设为 std::string
并进行测试,例如if (file_make == "y")
。这将允许您使用 getline
读取所有输入,避免混合使用 std::cin
和 getline
的问题。
剩下的问题是完全无法验证文件打开,例如if (!file_out.is_open()) { /* handle error */ }
对每个输入都需要进行类似的测试,以确保您可以通过用户使用 Ctrl+d(或 Ctrl+z 在 windows).
此外,避免将 using namespace std;
放入 header 文件中。没有必要将标准名称空间拉入每个使用 header 的文件中(尽管您确实做得很好,并且使用 header 守卫 FILE_OPENING_AND_CLOSING_H
防止了多重包含)。事实上,这里根本没有 using namespace std;
的理由。只需对 cin, cout
等使用 std::
名称空间解析运算符..
将验证留给您添加,解决其他问题,您可以执行类似以下操作:
File_Opening_and_Closing.h
#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
File_Opening_and_Closing.cpp
#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();
}
main.cpp
#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
模式。
例子Use/Output
$ ./bin/main
Enter the file name and type => out1
Enter the string => foobar
foobar
Do you want to insert text again ? 'y' OR 'n'
y
Enter the string => barbaz
barbaz
Do you want to insert text again ? 'y' OR 'n'
n
Do you want to Make another file ? 'y' OR 'n'
y
Enter the file name and type => out2
Enter the string => bazbuz
bazbuz
Do you want to insert text again ? 'y' OR 'n'
n
Do you want to Make another file ? 'y' OR 'n'
n
生成的输出文件
$ cat out1
barbaz
$ cat out2
bazbuz
如果您还有其他问题,请告诉我。
我想用一个外部class“File_Opening_and_Closing.cpp”做一个简单的文件输入输出程序,当我使用“getline()”函数没有任何循环 它工作正常,但是当我在“main.cpp”中使用“getline ()”函数 with do while loop 时,它会崩溃。
请告诉我问题出在哪里,我是如何解决的?
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;}
with out loop working fine >>
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
你有一大堆问题,尤其是 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];
如果您需要 1 个以上的 class 实例,请使用 classes 向量或 classes 数组。但是,您的代码中都不需要。由于您通过 do { ... } while (..);
循环每次迭代都创建了 File_Opening_and_Closing
的新实例,因此您可以简单地使用:
File_Opening_and_Closing file;
通过将 file_make
和 file_insert
声明为 char
类型,您正在 给自己带来难以置信的困难 。相反,只需将它们设为 std::string
并进行测试,例如if (file_make == "y")
。这将允许您使用 getline
读取所有输入,避免混合使用 std::cin
和 getline
的问题。
剩下的问题是完全无法验证文件打开,例如if (!file_out.is_open()) { /* handle error */ }
对每个输入都需要进行类似的测试,以确保您可以通过用户使用 Ctrl+d(或 Ctrl+z 在 windows).
此外,避免将 using namespace std;
放入 header 文件中。没有必要将标准名称空间拉入每个使用 header 的文件中(尽管您确实做得很好,并且使用 header 守卫 FILE_OPENING_AND_CLOSING_H
防止了多重包含)。事实上,这里根本没有 using namespace std;
的理由。只需对 cin, cout
等使用 std::
名称空间解析运算符..
将验证留给您添加,解决其他问题,您可以执行类似以下操作:
File_Opening_and_Closing.h
#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
File_Opening_and_Closing.cpp
#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();
}
main.cpp
#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
模式。
例子Use/Output
$ ./bin/main
Enter the file name and type => out1
Enter the string => foobar
foobar
Do you want to insert text again ? 'y' OR 'n'
y
Enter the string => barbaz
barbaz
Do you want to insert text again ? 'y' OR 'n'
n
Do you want to Make another file ? 'y' OR 'n'
y
Enter the file name and type => out2
Enter the string => bazbuz
bazbuz
Do you want to insert text again ? 'y' OR 'n'
n
Do you want to Make another file ? 'y' OR 'n'
n
生成的输出文件
$ cat out1
barbaz
$ cat out2
bazbuz
如果您还有其他问题,请告诉我。