首页 > 解决方案 > C 编程:将整数写入文本文件

问题描述

我正在尝试使用 write() 系统调用在文本文件上写入几个整数,但是在数字之外我得到了奇怪的符号(00\00\00\00\00\00)。

Gedit 告诉我编码存在问题,并且文件不是 UTF-8 格式。我正在使用 gcc 编译,它应该默认设置 UTF-8 编解码器。我通过将 sizeof(i) 更改为 1 解决了“\00”,但我无法解析数字。

int main(int argc, char const *argv[]) {
   int fd=open("test.txt", O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
   int i = 2;
   write(fd, &i, sizeof(i)); }

标签: clinuxsystem-calls

解决方案


您必须了解数字在计算机中的表示方式:当您2在屏幕上阅读时,内存中实际保存的是数字 50。

这是ASCII 表2中字符的代码。

实际的数字 2 不对应于可打印的字符,即您可以在屏幕上阅读的符号,因此 Gedit 等不同的文本编辑器的行为会有所不同:有些会显示正方形或圆点,其他会显示带有一些转义的数字,例如性格。

UTF-8 实际上向后兼容 ASCII,因为它为英文字母、数字和一些其他字符提供与 ASCII 相同的代码。

整数变量保存计算机可以执行计算的实际数字,而不是您作为人类可以阅读的字符。

如果您使用的是 32 位操作系统,int在 C 中将是 32 位或 4 字节。由于您很可能使用 x86 处理器,因此该数字将以小端顺序重新分配。

因此,当您使用代码将这些字节写入文件时,文件在磁盘上将如下所示:

+---+---+---+---+
| 2 | 0 | 0 | 0 |
+---+---+---+---+

Gedit 会尝试将其读取为 4 个字符,但它无法打印它们,因此它会显示它们的值,前面带有 '\' 宪章,这样你就会知道这些是特殊的不可打印字符。

有两种方法可以使用write()并且仍然可以获得您想要的文本表示。
首先,您需要一个数组char来创建数字的字符串表示形式。

然后,您可以执行以下两项操作之一:

  1. 作弊并用于sprintf轻松地将数字格式化为字符串。
  2. 通过循环和一些简单的数学运算自己完成工作,并将数字中的每个十进制数字转换为它的 ASCII 字符。
    这是一个提示:只需添加 0x30(十六进制 30)

推荐阅读