繁体   English   中英

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

[英]C++ pwrite(), pread() data to a text file

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

我正在将char * pointer用于字符和整数,但是由于文本填充会打印出混杂的整数值(@,颠倒的?等),所以我陷入了困境,就像当我使用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?

分解成块:

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

根据定义,每个ASCI字符 都是一个字节,并且您没有提到需要编写可感知区域设置的多字节字符或Unicode派生类,因此我认为您可能已经覆盖了这一点。

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

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

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

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

“我将char * pointer用于字符和整数,但是由于文本填充会打印出混杂的整数值(@,颠倒的?等),所以我陷入了困境”

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

底线是,如果您不知道ASCI字符和整数字节之间的区别,那么说明pwrite()工作原理将pwrite()但会让您更加困惑。

“就像当我pwrite()指针[0] = 105时; 105转换text.txt文件中的“ i”(而pread()读为“ i”),以某种方式使105丢失了

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

最后, pwrite()是POSIX系统调用,适用于Linux,BSD和其他选择公开它的人。 不是 C或C ++标准的一部分。 就是说,您应该从系统调用open()获得pwrite()第一个参数。 除非您通过受支持的API来这样做,否则您永远不要背负假定由其他api调用打开的文件描述符。 这个问题中的代码没有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM