在 C 中使用 fopen 和 'w' 模式存储整数

问题描述 投票:0回答:2

亲们,这是我从网上拿来的一个例子,为了便于理解,我稍微修改了一下,'wb'改为'w','bin'改为'txt'。


#include <stdio.h>
#include <stdlib.h>

int main()
{
   FILE * fp;
   int x = 0, i = 0;

   fp = fopen ("TestFile.txt", "w");

   for(i=0; i<10 ;i++) {
       x = i;
       fwrite(&x,sizeof(int),1,fp);
   };

   fclose(fp);
   return(0);
}

这里到底发生了什么? 1 'w' 表示我想写入文本文件。 2 里面存放的是二进制格式。 问题 1 和 2:扩展名在这里没有任何意义,'w' 是否定义它是一个文本文件,即使内部数据是二进制的?

3 我试图将 4 个字节存储在一个接受 1 个字节的文件中并将其转换为二进制文件的事实?

我知道我可以用这种方式创建纯文本。

char y = i + '0';
fwrite(&y,sizeof(char),1,fp);

4 有人真的以纯文本形式存储数字吗?如何,最好的方法是什么? 提前致谢。

c fopen fwrite
2个回答
1
投票

问题1&2:扩展名在这里没有任何意义,

正确。

是定义它是文本文件的“w”,即使内部数据是二进制的?

w
相反的
wb
意味着它是作为文本文件打开的,是的。其影响取决于系统,但比您预期的要低。在 Linux 和 MacOS 上,两者之间没有实际区别。在 Windows 上,我知道的唯一区别是系统会自动在内部换行符和外部回车/换行符对之间进行转换。从历史上看,也许仍然是今天,有些系统的差异更为显着。

在您的情况下,您在文件中获得了原始二进制数据,因为您使用用于该目的的 I/O 函数 (

fwrite
) 编写它。如果你想在你的文本文件中格式化文本然后使用
fprintf()
来写它,或者把它格式化成字符串中的文本格式然后写那个。

3 我试图将 4 个字节存储在一个接受 1 个字节的文件中并将其转换为二进制文件的事实?

我不确定你的意思,但你在文件中获取二进制数据,因为这就是

fwrite()
所做的。

4 有人真的用纯文本存储数字吗?

是的,这很常见。有多种方法可以做到这一点;见上面两个。


1
投票

区分您编写的是“文本”格式还是“二进制”格式的主要因素是您调用的函数。其他一切都是次要的。

如果你打电话

fwrite(&x, sizeof(int), 1, fp);

然后您正在编写二进制表示:通常为 2 或 4 个字节,采用紧凑的二进制形式, 人类可读格式。

另一方面,如果你打电话

fprintf(fp, "%d\n", x);

然后你正在写一个漂亮的,人类可读的“文本”格式,用尽可能多的数字字符来表示数字

x
.

一般来说,如果你调用

fwrite
,那么你应该打开文件模式
"wb"
fwrite
 例子).
通常,如果您调用
fwrite(&y, sizeof(char), 1, fp)

,那么您应该已经打开了文件模式

fprintf

(尽管否则不会出错)。
你使用的文件名和扩展名
完全

由你决定:C不看那些,C不关心。

似乎您认为其中之一

使用

"w"
    代替
  • "w"
    
    
    命名文件
    "wb"
  • 而不是
  • .txt
    
    
     可能会以某种方式改变 
  • .bin
函数的功能。但事实并非如此。请记住,C 是一种低级语言:它通常完全按照您的指示进行操作,没有“

DWIM

”功能。

© www.soinside.com 2019 - 2024. All rights reserved.