C++ 如何使用FGET?

C++ 如何使用FGET?,c++,C++,如何在添加故事功能中使用fgets 当我使用gets时效果很好,但当使用fgets时效果不好 void add_story() { clear(); ofstream file; char name[10]; cout << "\n\n\tEnter your file name: "; cin.ignore(); fgets(name,10,stdin); file.open(name

如何在添加故事功能中使用fgets

当我使用gets时效果很好,但当使用fgets时效果不好





   

void add_story() {
    clear();
    ofstream file;
    char name[10];
    cout << "\n\n\tEnter your file name: ";
    cin.ignore();
    fgets(name,10,stdin);  
    file.open(name);
    if (!name) {
        cout << "\tError open file\n";
        add_story();
    }
    else {
        char wards[200];
        cout << "\t Enter your daily: \n";
        fgets(wards, 20, stdin);
        file << wards<<"\n";
        cout << "\t--------------------------------------------------------------\n";
    }
     file.close();
}






void add_story(){
清除();
流文件;
字符名[10];

用strcspn()
关闭潜在的拖尾
\n


以下是fgets手册页的摘录:

fgets()从流中最多读取一个小于大小的字符,并且 将它们存储到s指向的缓冲区中。在 EOF或换行符。如果读取换行符,则将其存储到缓冲区中。 终止的空字节('\0')存储在中的最后一个字符之后 缓冲区


以下是gets手册页的摘录:

gets()将一行从stdin读入由s指向的缓冲区,直到 终止换行符或EOF,用空字节替换 ('\0')


因此,fgets将换行符存储在缓冲区中。文件名很可能不包含换行符,因此找不到文件,并且您的程序无法运行。

您使用的是
fgets
而不是
cin
?它不能很好地描述实际问题。可能不是整个问题,但
如果(!name)
检查永远不会进入错误块!我想你可能是指
如果(!file)
…我猜这是因为
fgets()
包含行尾字符。你是被迫使用C风格编程还是可以使用
std::string
std::getline()
?取决于平台,
name[strcspn(名称,“\r\n”)]='\0';
也可能有用。@Eljay True。。。。。
char name[10];
if (fgets(name, sizeof name, stdin))  {
  name[strcspn(name, "\n")] = '\0';
  file.open(name);