【发布时间】:2013-07-16 07:33:55
【问题描述】:
从这里提出的几个问题中我对 char 类型的理解是,在 C++ 中它始终是 1 字节,但位数可能因系统而异。
sizeof() 运算符使用char 作为单位,所以sizeof(char) 总是1 以C++ 字节为单位。(取本地机器地址最小单位的位数)如果使用@ 的文件函数时987654328@在二进制模式中,我们直接读写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();
除非char 总是以字节为单位使用现有标准8 位,否则如果将一堆数据写入16 位机器中的文件并在32 位机器中读取会发生什么情况?或者我应该使用依赖于操作系统的文本模式?如果不是,我误解了什么是真理?
编辑:我已经纠正了我的错误。
感谢您的警告。
Edit2:我的系统是64 位,但我得到char 类型的位数为8。出了什么问题?我得到8false结果的方式是什么?
我通过使用位运算符将char 变量移动到超出其可能大小的位置得到了00000...。在保证变量的所有位为零后,我通过反转它得到了111... .并移动直到它变为零。如果我们移动它its size time,我们得到一个零,所以我们可以从下面终止的循环的索引中获得位数。
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:为什么会有这些缺点?我的错误是什么?问题还不够清楚吗?也许我的问题很愚蠢,但为什么没有任何与我的问题相关的回复?
【问题讨论】:
-
sizeof(a)没有给你字符数,它给你一个指针的大小,因为a是一个指针。处理 C 字符串时使用strlen获取字符数。 -
解决您的标题和第一句话:C++“字节”不一定与文件系统字节相同。在 C++ 标准中使用时,“字节”表示“
char变量的大小”。 -
大约 20 分钟前问过。你们真的懒得用搜索,可以吗? sizeof() function in C 的可能重复项
-
是的,我应该定义为 char a[]="blabla" 以通过 sizeof 获得正确的长度。这只是一个匆忙的例子。抱歉。如果字节不一定与文件系统字节相同,那么文件系统字节究竟代表什么,您有什么建议,或者您可以举一个二进制模式的可移植代码示例以正确读取和写入数据?
-
@Tuntuni:问题的原始版本将
a定义为指针。已编辑为char a[]="asdfghjkkll";;通过该更改,sizeof a确实会产生字符数(包括终止的'\0')。