C ++ pwrite(),pread()数据到文本文件

时间:2012-11-25 04:06:44

标签: c++ pointers

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

我正在使用char *指针来表示字符和整数,但由于文本填充打印了整数的混乱值(@'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?

1 个答案:

答案 0 :(得分:1)

打破这个块:

  

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

根据定义,每个ASCI character 一个字节,你没有提到需要编写区域设置感知的多字节字符或Unicode派生词,所以我在想在这个你可能已被覆盖。

  

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

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

  1. 对于签名数据,值范围为[-128,127]
  2. 对于无符号数据,值的范围可以是[0,255]
  3. 这些是单个八位字节中整数值的限制。

      

    “我正在使用char *指针来表示字符和整数,但是因为文本填充打印了整数的混乱值(@'s,颠倒?等等)我才会卡住”

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

    最重要的是,如果你不知道ASCI字符和整数字节之间的区别,解释pwrite()如何工作将会带来一些好处,但会让你更加困惑。

      

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

    请参阅本答案中链接了几个地方的ASCI图表。字节值105实际上是字符“i”的ASCI值。 105不丢失;它被显示为它代表的角色。

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