EOF在C中是文件的结尾,但如何编写文件的开头?

EOF在C中是文件的结尾,但如何编写文件的开头?,c,file,io,stream,C,File,Io,Stream,我只是想知道有没有办法检查一个字符是否是整个文件或输入中的第一个字符?就像我可以检查字符是否为EOF一样,我可以检查它是否是文件的开头吗?EOF是一个带内信号值,它不是从文件中读取的,而是由系统运行时环境C标准库生成的,用于通知程序没有更多的数据要读取 您可以使用ftell或fgetpos检索文件的当前读/写位置。如果它告诉您位置为0,您就知道您在文件的开头。EOF是一个带内信号值,它不是从文件读取的,而是由系统运行时环境C标准库生成的,用于通知程序没有更多的数据要读取 您可以使用ftell或f

我只是想知道有没有办法检查一个字符是否是整个文件或输入中的第一个字符?就像我可以检查字符是否为EOF一样,我可以检查它是否是文件的开头吗?

EOF是一个带内信号值,它不是从文件中读取的,而是由系统运行时环境C标准库生成的,用于通知程序没有更多的数据要读取


您可以使用ftell或fgetpos检索文件的当前读/写位置。如果它告诉您位置为0,您就知道您在文件的开头。

EOF是一个带内信号值,它不是从文件读取的,而是由系统运行时环境C标准库生成的,用于通知程序没有更多的数据要读取


您可以使用ftell或fgetpos检索文件的当前读/写位置。如果它告诉您位置为0,您就知道您处于文件的开头。

作为程序员,您可以控制从哪里读取

打开文件时,除了附加到非空的现有文件时,文件的第一个字符处。 使用fseek移动文件指针时,会告诉文件系统指针的放置位置。您也可以使用倒带 您可以使用ftell询问文件系统您在文件中的位置
EOF不是文件的最后一个数据,它只是您在文件末尾试图读取的信息。

作为一名程序员,您可以控制从哪里读取

打开文件时,除了附加到非空的现有文件时,文件的第一个字符处。 使用fseek移动文件指针时,会告诉文件系统指针的放置位置。您也可以使用倒带 您可以使用ftell询问文件系统您在文件中的位置
EOF不是文件的最后一个数据,它只是您在文件末尾尝试读取的信息。

EOF不是从文件中读取的字符;它是库函数返回的值,这些函数尝试从文件中读取,但由于错误或其他原因无法读取。不管怎样,没有,没有转炉。您可以使用ftell检查当前文件位置,并适当地检查该位置是否存在潜在故障。使用fopen打开文件后,您已经处于文件的开头。如果您询问是否有特殊字符标记文件的开头,答案是否。EOF不是从文件中读取的字符;它是库函数返回的值,这些函数尝试从文件中读取,但由于错误或其他原因无法读取。不管怎样,没有,没有转炉。您可以使用ftell检查当前文件位置,并适当地检查该位置是否存在潜在故障。使用fopen打开文件后,您已经处于文件的开头。如果您询问是否有一个特殊字符标记文件的开头,答案是否。它不会告诉您位置,而是告诉您呼叫是否成功。位置存储在fpos_t参数中,该参数是实现定义的,可能包含诸如mbstate_t之类的附加数据,也就是说,您不能以可移植的方式从中读取位置。@DevSolar:是的,fgetpos为您提供了实现定义的fpos_t,但实现定义并不意味着您不能访问它。只要在编译时仔细检查实现,就完全可以使用实现定义的行为。确切地说,fpos_t的性质是未指定的,即实现不需要以任何方式记录或访问其内部。我想知道如果你的假设不成立,除了希望你的编译失败之外,你会如何在编译时检查实现,让尝试编译的人摸不着头脑…@DevSolar:据我所知,现有的每个C实现都将设置两个预处理器宏,它们将非常明确地标识正在使用的编译器。有了这些知识,就可以可靠地测试实现中存在的众所周知的实现定义的宏。但是fpos_t是库实现的域,而不是编译器的域,因此编译器预定义将告诉您该类型中的内容不给你职位,它给你电话是否成功。位置存储在fpos_t参数中,该参数是实现定义的,可能包含诸如mbstate_t之类的附加数据,也就是说,您不能以可移植的方式从中读取位置。@DevSolar:是的,fgetpos为您提供了实现定义的fpos_t,但实现定义并不意味着您不能访问它。只要在编译时仔细检查实现,使用实现定义的行为是完全允许的
记录或以任何方式接近其内部。我想知道如果你的假设不成立,除了希望你的编译失败之外,你会如何在编译时检查实现,让尝试编译的人摸不着头脑…@DevSolar:据我所知,现有的每个C实现都将设置两个预处理器宏,它们将非常明确地标识正在使用的编译器。有了这些知识,我们可以可靠地测试实现中存在的众所周知的实现定义宏。但是fpos_t是库实现的域,而不是编译器,因此编译器预定义将告诉您该类型中的内容-与datenwolf的答案相同-fgetpos不提供文件中的位置,它提供了一个倾斜的数据结构,您可以将其传递给fsetpos以恢复该位置,仅此而已。打开文件时,您位于文件的第一个字符处。如果文件是为附加模式a或a+@chqrlie打开的,则此语句不太明显:请注意,附加模式仅引用此处的标准会导致对文件的所有后续写入都被强制到文件的当前结尾,而不考虑对fseek函数的中间调用。因此,一个实现可以在打开文件后将位置放在文件的开头,并且只在写入操作启动后重新定位。。。此外,由于空字符填充,使用追加模式打开二进制文件可能会在最初将流的文件位置指示符定位到最后写入的数据之外,因此基本上所有下注都是关闭的-@戴夫索拉:是的,确实如此,这就是我所说的“不那么明显”的意思。如果文件已打开以进行追加,则位置可能在文件开头,也可能不在文件开头。这基本上是不相关的,因为从为append a或ab打开的文件中读取数据是未定义的。但是关于更新模式a+和ab+,标准奇怪地模棱两可,无法确定在打开文件后是否会在文件的开头或结尾读取,从而导致失败。@chqrlie记住了这个问题。OP是初学者,需要一个简单的答案。与datenwolf的答案相同-fgetpos不会给出文件中的位置,它会提供一个倾斜的数据结构,您可以传递给fsetpos以恢复该位置,不再需要。打开文件时,您位于文件的第一个字符处。如果文件是为附加模式a或a+@chqrlie打开的,则此语句不太明显:请注意,附加模式仅引用此处的标准会导致对文件的所有后续写入都被强制到文件的当前结尾,而不考虑对fseek函数的中间调用。因此,一个实现可以在打开文件后将位置放在文件的开头,并且只在写入操作启动后重新定位。。。此外,由于空字符填充,使用追加模式打开二进制文件可能会在最初将流的文件位置指示符定位到最后写入的数据之外,因此基本上所有下注都是关闭的-@戴夫索拉:是的,确实如此,这就是我所说的“不那么明显”的意思。如果文件已打开以进行追加,则位置可能在文件开头,也可能不在文件开头。这基本上是不相关的,因为从为append a或ab打开的文件中读取数据是未定义的。但是关于更新模式a+和ab+,标准奇怪地模棱两可,无法确定在打开文件后是否会在文件的开头或结尾读取,从而导致失败。@chqrlie记住了这个问题。OP是一个初学者,需要一个简单的答案。