c - 我的文件中出现了奇怪的字符。我在C语言中使用无缓冲I/O流

标签 c file unix io stream

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
  int i, stream;

  for (i = 20; i < 40; i++) {
    if (i % 2 == 0) {

      stream = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0644);
      char *x;
      *x = i;
      write(stream, &x, 1024);

      close(stream);
    }
  }
  return 0;
}

我在文件中得到如下字符:

@^@^@^@^@Z^@^@2@^@^@

最佳答案

代码中存在多个问题。

一个

char *x;
*x = i;

这将创建一个不指向任何地方的指针,并立即通过该指针进行写入。未定义的行为。您可能想要这个:

char x = i;

两个

write(stream, &x, 1024);

这将从变量x的地址开始写入1024个字节。在原始情况下,x 是一个指针,因此它很可能占用 4 或 8 个字节(分别取决于您的系统是 32 位还是 64 位)。通过我上面建议的更改,x 是一个单字节变量。

无论哪种情况,都没有 1024 字节的数据可供写入。您的意思可能是:

int main(int argc, char* argv[]) {
  int i, stream;

  for (i = 20; i < 40; i++) {
    if (i % 2 == 0) {

      stream = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0644);
      char x = i;
      write(stream, &x, 1);

      close(stream);
    }
  }
  return 0;
}

关于c - 我的文件中出现了奇怪的字符。我在C语言中使用无缓冲I/O流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57006948/

相关文章:

c - C++ 上的整数验证

c - 通过单声道辅助线将音调从 arduino 发送到 3.5 毫米插孔的扬声器

java - 如何检查图像是否存在于特定位置?

java - 为什么我正在编写的文件中多了一行?

linux - Bash脚本运行顺序,为什么它会对读取命令进行排队?

c++ - 在 x86-64 平台上用 C(++) 计算 64 位无符号参数的 (a*b)%n FAST?

c - 制作文件以写入来自serialPort的所有信息

android - 安卓WIFI传输文件

unix - 如何使用tcl文件中的sed

c - 是否可以覆盖/绕过 nscd?