我正在为学校编写一个使用Xcode的程序,需要我们使用open()系统调用。我做了
int input_file_desc = open(input_path, O_RDONLY);
printf("input file desc %d:\n", input_file_desc);
它出现-1。文件的路径是〜/ data_to_read。我在xcode中设置了命令行参数。 input_path
是我从命令行获得的const char *
。出于某种原因,如果我将文件名和命令行参数更改为〜/ data_to_read.txt,它可以正常工作。如果需要更多信息,请与我们联系。感谢。
编辑:我只用.txt尝试过来看看是不是问题,但我仍然不知道为什么它首先需要扩展。你可以拥有没有扩展名的文件吗?在这种情况下它应该仍然有效,只要文件路径和参数都没有扩展名,对吧?
答案 0 :(得分:2)
看起来你正在使用C,为什么C ++标签呢?是允许的吗? C ++中有简单易用的类来操作文件。
但是你肯定需要在文件名(input_path
)中包含扩展名,因为同一目录中可以存在多个具有相同名称和不同扩展名的文件,那么应该打开哪一个?
编辑:应该知道文件扩展名(特别是在类UNIX操作系统中)只是一个“帮助”的东西,它们并不是真正必要的。例如,您可以拥有一个包含C ++代码但没有.cpp
扩展名的文件,例如它的名称foo
只有没有扩展名(或者甚至有像foo.bar
这样的疯狂扩展名)。你仍然可以使用g ++来编译它,因为只要内容对使用该文件的应用程序有效,扩展就不是很重要。
答案 1 :(得分:1)
我理解你的问题的方式,你问的是文件是否需要通过C open函数打开扩展名,对吧?答案是否定的。 C对您没有任何魔力,并将尝试使用您指定的确切文件名打开文件。如果文件有扩展名,则必须在api中指定,如果不是,则不应该。
检查errno变量中返回的错误代码(使用strerror或perror获取人类可读的错误消息)以找出错误。这应该指向正确的方向。
答案 2 :(得分:1)
正如其他人所说,扩展只是名称的一部分。
您遇到的问题可能是因为您的操作系统是Windows而且微软公司的人员有默认的“隐藏”扩展名的愚蠢想法,因此您的文件似乎被命名为“test”,而实际上它被命名为“test”。 txt“因为它是用记事本创建的。
在Windows系统上看到名为“foo.txt.txt”的文件也很常见,因为隐藏/显示/猜测/自动添加扩展程序这个完全愚蠢的想法根本不能正常工作。
您可以在计算机上设置首选项,以便始终显示文件扩展名,这是在Windows系统上最好的操作。如果您对编程感兴趣,可以考虑将编程切换到像linux这样对程序员不那么恶劣的环境。
答案 3 :(得分:0)
文件名不需要扩展名 - 文件可以称为“data_to_read”。但是系统上的大多数文件名做都有扩展名,只是Windows资源管理器会将它们隐藏起来。要从程序中打开文件,您需要指定此扩展名。
在Windows资源管理器中右键单击文件,然后选择“属性”以查明文件名是否具有扩展名。或者查看Windows命令提示符控制台中的文件。