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

时间:2013-07-17 16:13:56

标签: c++ file char fstream

我从这里提出的几个问题中了解char类型的是C ++中它总是1个字节,但是位数可能因系统而异。

sizeof()运算符使用char作为单位,因此sizeof(char)始终为1,以C ++为单位。(它取本地机器的最小地址单位的位数)如果在二进制模式中使用fstream()的文件函数时,我们直接读取和写入RAM中任何变量的地址,变量的大小作为写入的最小数据单位file应该是从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();

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


编辑:我纠正了我的错误 谢谢你的警告。


Edit2:我的系统位为64位,但我将char类型的位数设为8。有什么问题?我得到8错误的结果的方式是什么? 通过使用位运算符来移动00000...变量大于char变量,我得到了111...。在保证变量的所有位都为零之后,我得到了{its size time 1}}通过反转它。移位直到它变为零。如果我们移位它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; ,我们得到一个零,所以我们可以从下面终止的循环的indice获得位数。

i

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

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

1 个答案:

答案 0 :(得分:2)

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

  • VAST大多数系统使用8位字节
  • C和C ++标准要求char至少为8位
  • 大于8位的系统很可能有机制以某种方式利用(或至少转码)8位文件。