c - 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)); }
解决方案
您必须了解数字在计算机中的表示方式:当您2
在屏幕上阅读时,内存中实际保存的是数字 50。
这是ASCII 表2
中字符的代码。
实际的数字 2 不对应于可打印的字符,即您可以在屏幕上阅读的符号,因此 Gedit 等不同的文本编辑器的行为会有所不同:有些会显示正方形或圆点,其他会显示带有一些转义的数字,例如性格。
UTF-8 实际上向后兼容 ASCII,因为它为英文字母、数字和一些其他字符提供与 ASCII 相同的代码。
整数变量保存计算机可以执行计算的实际数字,而不是您作为人类可以阅读的字符。
如果您使用的是 32 位操作系统,int
在 C 中将是 32 位或 4 字节。由于您很可能使用 x86 处理器,因此该数字将以小端顺序重新分配。
因此,当您使用代码将这些字节写入文件时,文件在磁盘上将如下所示:
+---+---+---+---+
| 2 | 0 | 0 | 0 |
+---+---+---+---+
Gedit 会尝试将其读取为 4 个字符,但它无法打印它们,因此它会显示它们的值,前面带有 '\' 宪章,这样你就会知道这些是特殊的不可打印字符。
有两种方法可以使用write()
并且仍然可以获得您想要的文本表示。
首先,您需要一个数组char
来创建数字的字符串表示形式。
然后,您可以执行以下两项操作之一:
- 作弊并用于
sprintf
轻松地将数字格式化为字符串。 - 通过循环和一些简单的数学运算自己完成工作,并将数字中的每个十进制数字转换为它的 ASCII 字符。
这是一个提示:只需添加 0x30(十六进制 30)
推荐阅读
- git - Git Change Head to certain commit 不会更改文件中的数据
- javascript - 使用 javascript 显示图像的多个下拉菜单
- rest - REST API Google Drive 分段上传(C++ 生成器)
- oracle - 在 sqlplus 中执行脚本时出错,选项不是有效数字
- ios - 为什么有些图像使用 gpuimage 过滤会旋转 90 度?
- python - 访问文件中的第 n 个泡菜
- angular - Angular:急切加载使组件不被渲染
- python - 如何在 Python 3 的 Plotly 中将其悬停在折线图中一次显示数据点及其标签?
- angular - 如何仅从 json 响应中获取一些信息?
- python - Python Flask Server 生成太多新线程