visual studio c++;如何正确使用fopen()打开txt文件 我学习C++,内容包括打开.txt文件并从中读取。 项目结构如下:
我正在尝试fopen items.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
打开文件时出错:没有此类文件或目录
已解决
似乎唯一能修复此代码的方法是使用原始字符串文字,如下所示:
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
。此字符不能是路径的一部分,因此会报告无效参数
错误
还有其他的逃逸序列是未知的
有三种方法可以解决这个问题
\\
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
。此字符不能是路径的一部分,因此会报告无效参数
错误
还有其他的逃逸序列是未知的
有三种方法可以解决这个问题
\\
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";