首页 文章

作为C中的二进制值写入文件的char的大小

提问于
浏览
-4

我从这里提出的一些问题中了解到 char 类型的原因是它在C中总是 1 字节,但是位数可能因系统而异 .

sizeof() 运算符使用 char 作为一个单位因此 sizeof(char) 总是 1 以字节为单位 . (它取本地机器的最小地址单位的位数)如果在二进制模式下使用 fstream() 的文件函数时,我们直接从/读取/写入对于RAM中任何变量的地址,作为写入文件的最小数据单位的变量大小应该是从RAM读取的值的大小,对于从文件读取的值,它反之亦然 . 那么我们可以说如果尝试类似这样的事情,数据可能不会被 8 写成 8

ofstream file;
file.open("blabla.bin",ios::out|ios::binary);
char a[]="asdfghjkkll";
file.seekp(0);
file.write((char*)a,sizeof(a)-1);
file.close();

除非始终以字节现有标准 8 位使用 char ,否则如果将一堆数据写入16位机器中的文件并在32位机器中读取会发生什么?或者我应该使用依赖于操作系统的文本模式?如果没有,我误解了什么是真理?

Edit : 我纠正了我的错误 .
谢谢你的警告 .

Edit2: 我的系统是 64 位但我得到 char 类型的位数为 8 . 有什么问题?我得到 8 错误的结果的方式是什么?通过使用按位运算符将 char 变量移动到可能的大小以上,我得到了一个 00000... . 在保证变量的所有位都为零之后,我通过反转得到了 111... . 移动直到它变为零 . 如果我们移动它 its size time ,我们得到一个零,所以我们可以从下面终止的循环的indice获得位数 .

char zero,test;
zero<<=64; //hoping that system is not more than 64 bit(most likely)
test=~zero; //we have a 111...
int i;
for(i=0; test!=zero; i++)
 test=test<<1;

循环后 i 变量的值是 char 类型中的位数 . 根据此,结果为 8 . 我的最后一个问题是:文件系统字节和 char 类型是不同的数据类型,因为计算机处理文件流中的指针与标准 char 类型是不同的,这至少是 8 位?那么,背景究竟是怎样的呢?

Edit3: 为什么这些缺点?我的错是什么?问题不够明确吗?也许我的问题很愚蠢,但为什么没有任何与我的问题相关的回答?

1 回答

  • 2

    语言标准无法真正指定文件系统的功能 - 它只能指定语言与之交互的方式 . C和C标准也没有涉及与不同实现之间的互操作性或通信有关的任何事情 . 换句话说,除了这样说之外,对这个问题没有一般性的答案:

    • VAST大多数系统使用8位字节

    • C和C标准要求 char 至少为8位

    • 很可能大于8位的系统具有以某种方式利用(或至少转码)8位文件的机制 .

相关问题