关闭文件混乱与std :: getline()和cin?

jackofallcodes

我有一个运行良好的程序,直到在使用之前关闭文件为止std::getline()close(fileTest)行使while循环永远重复,而无需询问用户输入。getline()即使在第一个循环上,它也只会跳过

我花了大约2个小时试图弄清楚这一点,所以我了解所有有关缓冲区和cin>>行为的知识。我最终在getline()通话之前注释掉了台词,并了解了发生的情况。

显然,我遇到了很多有关输入缓冲区的重复问题,并且我知道文件的工作方式相似,但是我不明白为什么getline()当我明确地从中请求数据时搞砸了,cin或者为什么关闭文件触发了它。

知道为什么会发生这种情况或解决方法(不只是让文件永久打开)吗?

#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
//#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include <string.h>
#include <limits>

using namespace std;

char *fileName;
struct stat fileStatus;

int main(int arc, char **argv)
{
    fileName = argv[1];
    string menuChoice = "1";

    //TODO: remove this. Testing only
    fileName = (char *)"test";

    //print message for no args
    if (fileName == NULL)
    {
        printf("NO file selected\nUsage: fileutil <filename>\n\n");
    }

    //Make sure we can actually open the file
    int fileTest;
    if (fileTest = (open(fileName, O_RDONLY)) < 0)
    {
        perror("Failed to open file");
        return (EXIT_FAILURE);
    }
    close(fileTest);  //THIS MESSES UP cin IF NOT COMMENTED OUT?????

    //main menu loop
    while (true)
    {
        //display the menu and handle options
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::getline(cin, menuChoice);
        //view file contents
        if (menuChoice == "1")
        {
        }
        //display file info
        else if (menuChoice == "2")
        {
        }
        //change file permissions
        else if (menuChoice == "3")
        {
        }
        //copy file
        else if (menuChoice == "4")
        {            
        }
        //exit
        else if (menuChoice == "5")
        {
            printf("Thank you. Exiting program...\n\n");
            return (0);
        }
        //handle invalid responses
        else
            printf("Invalid response\n\n");
    }

    return 0;
} //end main
用户名

fileTest = (open(fileName, O_RDONLY)) < 0比较,因为它具有较高的优先级分配之前进行。因此,fileTest将不保存open调用结果,而是保存比较结果,该结果可能与标准输入/输出句柄之一(通常为0、1、2)相同。因此,随后close将关闭标准输入,而open丢失的返回句柄将丢失。open还应将-1的结果进行检查。

因此,经验法则是永远不要使用赋值运算符的结果:

auto const fileTest{::open(fileName, O_RDONLY)};
if (-1 == fileTest)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从其他线程中断std :: cin(std :: cin.getline)执行

使用 std::cin.getline() 后如何保留 std::cin 的缓冲区

cin 和 getline 的使用导致错误

C ++中的Getline和cin.ignore

混合cin和getline输入问题

提升和关闭 - 混乱

cin.get()和cin.getline()之间的区别

std :: getline(std :: cin,string)可能会因键盘输入而失败的方法

C ++中std :: cin和isdigit的问题

如何避免cin.operator >>和getline之间的冲突?

Cin 和 getline 不会正确保存非 ascii 字符

使用getline处理重定向文件输入后,使用cin进行键盘输入

cin.ignore如何与cin和getline一起使用?

与文件读取和使用getline的标准输入不同的结果

getline(cin,str)的奇怪输出

getline(cin)行为异常(C ++)

如何将cin和cout重定向到文件?

打开 ofstream 文件时 cin 和 cout 会做什么?

getline和cin接连使用会跳过下一个输入

為什麼 cin 和 getline 表現出不同的閱讀行為?

移动构造函数和std :: move混乱

std :: cin不接受输入,程序立即关闭

尝试使用 std::copy() 和 std::back_inserter 从 std::cin 读取时的不同结果

文件包含混乱和错误

在opengl应用程序中使用std :: cin进行std :: thread和输入

我应该如何使用c ++处理“ std :: cerr”和“ std :: cin.fail()”?

std :: getline与std :: fstream

是否可以在同一行中一个接一个地使用cin和getline?

cin和getline在一个程序中,只有其中一个有效吗?