1

我必须将 pwrite() 字符写入文本文件,每个字符代表 1 个字节。另外,我需要将整数写入文本文件,所以 12 也必须是一个字节,而不是 2 个字节(即使是两个字符)。

我正在为字符和整数使用 char *pointer,但由于文本填充打印了整数的混乱值(@'s,颠倒的?'s 等),就像我 pwrite() 指针 [ 0] = 105;105 翻译 text.txt 文件中的“i”(并且 pread() 读取为“i”)不知何故 105 在翻译中丢失了。

任何想法如何正确地 pwrite()/pread() ?

ofstream file; file.open("text.txt");
char *characters = new char;
characters[0] = 105;
cout << pwrite(3, characters, 1, 0);

另外,3 是文件,我猜 :-P 不知道如何实际找到。然后 text.txt 文件中包含“i”(我假设为 ASCII 105)。那么当我 pread() 时,我怎么知道它最初是 'i' 还是 105?

4

1 回答 1

1

把它分成几块:

“我必须将 pwrite() 字符写入文本文件,每个字符代表 1 个字节”

根据定义,每个ASCI 字符 一个字节,并且您没有提到需要编写区域设置感知的多字节字符或 Unicode 衍生物,所以我正在考虑这个您可能已经涵盖的内容。

“另外,我需要将整数写入文本文件,所以 12 也必须是一个字节,而不是 2 个字节(即使是两个字符)”

您正在描述整数数据的二进制写入。但是,请记住,作为数字表示的“整数”可以大于仅由“一个字节”表示的数字。如果你想写一个可以用单个字节表示的整数,你的选择是:

  1. 对于有符号数据,值的范围为 [-128,127]
  2. 对于无符号数据,值的范围可以是 [0, 255]

这些是单个八位字节中整数值的限制。

“我正在为字符和整数使用 char *pointer,但我被卡住了,因为文本填充打印了整数的混乱值(@'s,倒置的?'s 等)”

我们之前介绍过的字符的 char 指针,可能会很好。整数不会。根据您的描述,您生成的文件不会是字面意义上的“文本”文件。它将包含字符数据(您的字符缓冲区)和二进制数据(您的整数)。请记住,单个字节内的值为 0x01 的整数就是这样,一个设置了第一位的单个八位字节。代表 ASCI字符“1”的字节将具有值 0x31(请参阅任何ASCI 图表),EBCDIC 的值为 0xF1(不要问)。使用您的示例,**您不能将值 12 写入单个字节并使其成为文件中可显示的“文本”(字符)数据。单字节整数值 12 将在您的文件中表示为单字节值 0x0C。试图将其视为“文本”是行不通的;它不是可打印的 ASCI。事实上,0x0C 的 ASCI 值实际上是一个换页控制字符。

最重要的是,如果您不知道 ASCI 字符和整数字节之间的区别,那么解释pwrite()工作原理不会有什么好处,反而会让您更加困惑。

“就像我 pwrite() 指针 [0] = 105 时一样;105 在 text.txt 文件中翻译 'i' (并且 pread() 读为 'i')不知何故 105 在翻译中丢失了”

请参阅此答案中链接多个位置的 ASCI 图表。字节值 105 实际上是字符“i”的 ASCI 值。105 没有丢失;它被显示为它所代表的字符。

最后,pwrite()是针对 Linux、BSD 和任何其他选择公开它的 POSIX 系统调用。它不是C 或 C++ 标准的一部分。也就是说,您的第一个参数 forpwrite()应该从系统调用中获得,open(). 除非您通过受支持的 API 来执行此操作,否则您永远不应搭载假定由不同 api 调用打开的文件描述符。这个问题中的代码没有。

于 2012-11-25T04:50:31.720 回答