c - 将 C 中的文件打印到标准输出的最有效方法是什么?

标签 c file

我坚持这个。目前我正在使用:

FILE *a = fopen("sample.txt", "r");
int n;
while ((n = fgetc(a)) != EOF) {
  putchar(n);
}

但是这种方法似乎有点低效。有没有更好的办法?我尝试使用 fgets:

char *s;
fgets(s, 600, a);
puts(s);

我发现第二种方法有一点不对,那就是 fgets 的第二个参数需要一个非常大的数字。

感谢所有建议。我找到了一种使用 open()、read() 和 write() 的方法(有人在 IRC 上告诉我这个)。

char *filename = "sample.txt";
char buf[8192];
int r = -1;
int in = open(filename, O_RDONLY), out = 0;
if (in == -1)
  return -1;
while (1) {
  r = read(in, buf, sizeof(buf));
  if (r == -1 || r == 0) { break; }
  r = write(out, buf, r);
  if (r == -1 || r == 0) { break; }
}

最佳答案

第二个密码坏了。您需要分配一个缓冲区,例如:

char s[4096];
fgets(s, sizeof(s), a);

当然,这并不能解决你的问题。

从输入中读取固定大小的 block 并写出读取的内容:

int n;
char s[65536];
while ((n = fread(s, 1, sizeof(s), a))) {
    fwrite(s, 1, n, stdout);
}

您可能还想检查 ferror(a) 以防它因到达 EOF 以外的其他原因而停止。

注意事项

  1. 我最初使用 4096 字节缓冲区,因为它是用于内存分配的相当常见的页面大小和用于文件系统的 block 大小。然而,我的 Linux 系统上的甜蜜点似乎在 64 kB 左右,这让我感到惊讶。也许 CPU 缓存是这里的一个因素,但我只是猜测。
  2. 对于冷缓存,这几乎没有什么区别,因为 I/O 分页将占主导地位;即使一次一个字节也以大致相同的速度运行。

关于c - 将 C 中的文件打印到标准输出的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3125954/

相关文章:

c - sigaction 如何既是结构又是函数?

iphone - iOS交叉编译!需要什么?

c - TCP 连接错误 "No buffer space available"

c# - 编辑 M4V 视频元数据

Android - 从 byte[] 数组播放 mp3

计算正弦的 C 程序给出的结果不准确

c - 共享库段错误;无法弄清楚 valgrind 错误

c++ - window ,C++ : send file to exe (c++ solution) and read data from sent file

java - 如何显示文件中的所有文本行而不是停在行尾?

java - Java : java. io.FileNotFoundException 中的错误:C:\Users\FSSD\Desktop\My Test(访问被拒绝)