我创建了一个.txt和.dat文件,并编写了一个程序来读取它的文本但是发生了一些奇怪的事情,无论扩展名如何,它都会从这两个文件中读取。 C程序可以从.txt,.dat,.bin以外读取的所有扩展名是什么?为什么会这样?
答案 0 :(得分:3)
C程序可以从任何文件中读取,无论其扩展名如何。
扩展程序实际上什么都不做。您可以将任何您喜欢的扩展名放在文本文件中,它仍然只是一个文本文件。其他类型的编码也是如此。当操作系统试图找出打开它的程序时,会出现差异。如果您重命名.jpg
文件.txt
并将其打开,则可能会在文本编辑器中打开,而不是在图片查看器中打开。图片查看器仍然可以打开它,因为它仍然包含其原始数据。
编辑:由于您似乎对从文件中读取文本和从文件中读取数据感兴趣,here是C中文件IO的一些文档。
fgets
和fputs
可以读取和写入文本数据:
char *fgets( char *buf, int n, FILE *fp );
int fputs( const char *s, FILE *fp );
fread
和fwrite
用于读取和写入二进制数据:
size_t fread(void *ptr, size_t size_of_elements,
size_t number_of_elements, FILE *a_file);
size_t fwrite(const void *ptr, size_t size_of_elements,
size_t number_of_elements, FILE *a_file);
小心!! 如下面Clifford所述:
如果文件[未]以二进制形式打开,
fread()
仍会转换行尾。对于真正的二进制数据格式,这可能会以可能难以发现的方式破坏您的代码。
fgetc
和fputc
可以一次读取一个字节的二进制数据:
int fgetc( FILE * fp );
int fputc( int c, FILE *fp );
答案 1 :(得分:2)
文件格式是您的应用程序代码解释的问题,它不是由文件扩展强加的 - 这只是一个命名约定 - 不再是。文件扩展名对文件I / O没有影响 - 它只是名称的一部分。文件扩展名甚至不影响内容的格式 - .dat文件可以很容易地包含纯文本(例如.xml和.html都是纯文本数据文件类型)。
stdio在文本和二进制文件之间唯一的区别是当作为文本文件打开时,平台相关的行结束转换可能发生。
在Windows上,这意味着在输入时,回车符+换行符(CR + LF)序列将替换为单个'\n'
字符('\n'
是实际上是一个换行符),并且在每个'\n'
的输出上将被转换为CR + LF。另一方面,在Linux上,没有任何区别,因为在任何情况下Linux / Unix线端约定都是单个LF。这种潜在的翻译使文件fseek()
的一些用法以文本复杂且不可移植的方式打开。
要将文件打开为“二进制”(即没有行结束翻译),请将b
附加到模式参数字符串,例如:
fp = fopen( "file.dat", "rb" ) ;
请注意,在二进制模式下打开文本文件有合理的原因,但您必须注意CR + LF序列将完整读取(CR由转义序列字符常量'\r'
表示在C)。