在文件处理 C 中使用文件路径和文件名的区别

Difference in using file path and file name in file-handling C

我目前正在学习文件处理,我发现某些来源对某些语法的提及有所不同。有些人说 fopen()fopen("filename.type","mode"),而其他人提到 fopen("filepath","mode")(在这种情况下,我正在搜索如何打开基本的 .txt 文件)。为什么会有所不同?两者不是都试图指向位于某处的同一个文件吗?

然而,当我尝试使用 fopen("filename.type","mode") 语法打开一个普通的 .txt 文件时,它工作正常,而 fopen("filepath","mode") 语法却给我一个错误(文件打开失败)。情况有所不同,现在我正在使用 .csv 文件,fopen("filepath","mode") 语法有效,而另一个无效。 这是因为 C 编译器本身没有指定 .csv 类型吗?我承认有两种类型的文件,它们是 .txt.bin.

第一个参数中的字符串必须与文件名完全匹配。它只是一个标签,向文件系统指示所请求文件的名称。

文档中的术语并不完全稳定;你问的这两个短语基本上意思是一样的。 path 术语严格来说更正确,并强调该字符串可能包含相对或绝对目录路径以及该目录中的文件名。

C 没有任何“文件扩展名”的概念,但它在某些平台上用于识别文件的“类型”。例如,Windows 使用文件扩展名来标识(粗略地)文件属于哪个应用程序。但就C而言,如果文件名包含扩展名,那是名称的强制性部分,需要包含。

(从技术上讲,如果您省略扩展名,OS 可以代表您决定打开哪个文件,但这不是现代系统的工作方式。但是例如,VMS 有文件版本的概念,这是可选的;如果您省略文件名的这一部分,OS 将始终打开文件的最新版本。)

如果您想打开文件 "/path/to/data.csv" 那么这是一个有效的文件路径。如果您当前的工作目录是 /path/to 那么您可以简单地省略该目录,直接打开 "data.csv"。您还可以指定一个相对路径,例如 "./data.csv",它只使用当前目录的 . 别名。

根据扩展名,.txt.bin 文件之间并没有真正的二分法,尽管有些系统在另一个层面上区分了“文本”和“二进制”文件。简而言之,二进制文件可以包含任意字节流,而文本文件对其可以包含的内容有一些约定和(在某些遗留系统上)限制。如今,区别主要在于行尾的规范化,不同的系统对于如何终止一行文本仍然有不同的约定; Windows 使用 CRLF,而 Unix-based 系统使用普通 LF。将字节流标识为“文本”为如何处理此类差异提供了一些指导。