【问题标题】:size of char being written to file as a binary value in C++在 C++ 中作为二进制值写入文件的 char 的大小
【发布时间】: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')。

标签: c++ file char fstream


【解决方案1】:

语言标准不能真正指定文件系统的作用——它只能指定语言如何与之交互。 C 和 C++ 标准也没有解决与不同实现之间的互操作性或通信有关的任何问题。换句话说,这个问题没有一般的答案,只是说:

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

【讨论】:

  • 感谢您的回答。您可以再次查看Edit2部分的问题吗?
猜你喜欢
  • 2020-08-10
  • 2018-05-16
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多