Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
visual studio c++;如何正确使用fopen()打开txt文件 我学习C++,内容包括打开.txt文件并从中读取。 项目结构如下: _C_File_Fopen_Fs - Fatal编程技术网

visual studio c++;如何正确使用fopen()打开txt文件 我学习C++,内容包括打开.txt文件并从中读取。 项目结构如下:

visual studio c++;如何正确使用fopen()打开txt文件 我学习C++,内容包括打开.txt文件并从中读取。 项目结构如下: ,c,file,fopen,fs,C,File,Fopen,Fs,我正在尝试fopen items.txt,但运气不好。。 因为我提供了完整的路径,所以我不确定问题出在哪里 迄今为止尝试的方法: 在完整路径中使用双反斜杠 错误仍然存在: 打开文件时出错:没有此类文件或目录 已解决 似乎唯一能修复此代码的方法是使用原始字符串文字,如下所示: static const char* full_name3 = R"(C:/Users/Lukas/Desktop/Programming/file_system_test/file_system_test/it

我正在尝试fopen items.txt,但运气不好。。

因为我提供了完整的路径,所以我不确定问题出在哪里

迄今为止尝试的方法:

  • 在完整路径中使用双反斜杠
  • 错误仍然存在:
    打开文件时出错:没有此类文件或目录

    已解决

    似乎唯一能修复此代码的方法是使用原始字符串文字,如下所示:

    static const char* full_name3 = R"(C:/Users/Lukas/Desktop/Programming/file_system_test/file_system_test/items.txt)";
        FILE* my_file3 = fopen(full_name3, "r");
        if (my_file3 == NULL) {
            perror("error opening file");
        }
    
    

    不再返回任何错误。

    我认为您的问题是文件名中的\没有正确转义。 文件名字符串应具有双反斜杠字符

    static const char* full_name = "C:\\Users\\Lukas\\Desktop\\Programming\\file_system_test\\file_system_test\\items.txt";
    

    您可以通过std::cout发送此字符串进行调试来测试这一点。

    我认为您的问题是文件名中的\in没有正确转义。 文件名字符串应具有双反斜杠字符

    static const char* full_name = "C:\\Users\\Lukas\\Desktop\\Programming\\file_system_test\\file_system_test\\items.txt";
    
    您可以通过std::cout发送此字符串进行调试来测试这一点。

    请注意字符串文字,因此您的路径:

    static const char*full\u name=“C:\Users\Lukas\Desktop\Programming\file\u system\u test\file\u system\u test\items.txt”;
    
    包含
    \f
    转义序列,该序列被解释为
    表单提要-ASCII编码中的新页面字节0x0c
    。此字符不能是路径的一部分,因此会报告
    无效参数
    错误

    还有其他的逃逸序列是未知的

    有三种方法可以解决这个问题

  • 正如Luka Rahne所建议的那样,使用反斜杠转义序列
    \\
  • 或者通过使用前斜杠(因为
    C
    假定是可移植的,所以标准库能够将Unix路径分隔符转换为特定于平台的路径分隔符)
  • static const char*full\u name=“C:/Users/Lukas/Desktop/Programming/file\u system\u test/file\u system\u test/items.txt”;
    
    <>如果你使用C++ 11或更新(你的代码是C不是C++,但是标签表示C++),你可以利用原始字符串文字:
    static const char*full\u name=R“(C:\Users\Lukas\Desktop\Programming\file\u system\u test\file\u system\u test\items.txt)”;
    
    在这里,我使用msvc进行了一些现场测试(文件名为:
    open.c
    ):

    #包括
    #包括
    int main(int argc,const char argv[])
    {
    #如果版本==0
    //此处'\f'用于重现错误“无效参数”:
    静态常量字符名[]=“C:\fUsers\\User\\Downloads\\open.C”;
    #elif版本==1
    静态常量字符名[]=“C:\\Users\\User\\Downloads\\open.C”;
    #elif版本==2
    static const char name[]=“C:/Users/User/Downloads/open.C”;
    #elif版本==3
    静态常量字符名[]=R“(C:\Users\User\Downloads\open.C)”;
    #恩迪夫
    文件*f=fopen(名称,“r”);
    如果(!f){
    佩罗尔(“福彭”);
    返回1;
    }
    字符buf[256]=“”;
    fgets(buf,sizeof(buf),f);
    printf(“%s\n”,buf);
    fclose(f);
    返回0;
    }
    
    下面是从
    cmd.exe
    编译和运行的结果:

    C:\Users\User\Downloads>cl open.C/D VERSION=0&&open.exe
    针对x86的Microsoft(R)C/C++优化编译器版本19.28.29336
    版权所有(C)微软公司。版权所有。
    开放式c
    Microsoft(R)增量链接器版本14.28.29336.0
    版权所有(C)微软公司。版权所有。
    /输出:open.exe
    open.obj
    fopen:无效参数
    C:\Users\User\Downloads>cl open.C/D VERSION=1&&open.exe
    针对x86的Microsoft(R)C/C++优化编译器版本19.28.29336
    版权所有(C)微软公司。版权所有。
    开放式c
    Microsoft(R)增量链接器版本14.28.29336.0
    版权所有(C)微软公司。版权所有。
    /输出:open.exe
    open.obj
    #包括
    C:\Users\User\Downloads>cl open.C/D VERSION=2&&open.exe
    针对x86的Microsoft(R)C/C++优化编译器版本19.28.29336
    版权所有(C)微软公司。版权所有。
    开放式c
    Microsoft(R)增量链接器版本14.28.29336.0
    版权所有(C)微软公司。版权所有。
    /输出:open.exe
    open.obj
    #包括
    C:\Users\User\Downloads>cl open.C/D VERSION=3&&open.exe
    针对x86的Microsoft(R)C/C++优化编译器版本19.28.29336
    版权所有(C)微软公司。版权所有。
    开放式c
    open.c(11):警告C4129:“m”:无法识别的字符转义序列
    open.c(11):警告C4129:“D”:无法识别的字符转义序列
    open.c(11):警告C4129:“o”:无法识别的字符转义序列
    open.c(11):错误C2065:“R”:未声明的标识符
    open.c(11):错误C2143:语法错误:缺少“;”在“字符串”之前
    open.c(11):错误C2099:初始值设定项不是常量
    
    所以一切都按照我所描述的那样工作,最后一个版本
    3
    失败,因为我将代码编译为
    C

    字符串文本注释,所以您的路径:

    static const char*full\u name=“C:\Users\Lukas\Desktop\Programming\file\u system\u test\file\u system\u test\items.txt”;
    
    包含
    \f
    转义序列,该序列被解释为
    表单提要-ASCII编码中的新页面字节0x0c
    。此字符不能是路径的一部分,因此会报告
    无效参数
    错误

    还有其他的逃逸序列是未知的

    有三种方法可以解决这个问题

  • 正如Luka Rahne所建议的那样,使用反斜杠转义序列
    \\
  • 或者通过使用前斜杠(因为
    C
    假定是可移植的,所以标准库能够将Unix路径分隔符转换为特定于平台的路径分隔符)
  • static const char*full\u name=“C:/Users/Lukas/Desktop/Programming/file\u system\u test/file\u system\u test/items.txt”;
    
    <>如果你使用C++ 11或更新(你的代码是C不是C++,但是标签表示C++),你可以利用原始字符串文字:
    static const char*full_name=R”(C:\Users\Lukas\Desktop\
    
    static const char* full_name = "C:\\Users\\Lukas\\Desktop\\Programming\\file_system_test\\file_system_test\\items.txt";