c - 从 stdin 读取(可变长度文件)

标签 c stdin

所以我一直在尝试以各种不同的方式将其用于作业工作,但每次我都会遇到不同的错误。基本上我们拥有的是一个需要逐字节读取将要通过管道传入的文件内容的程序(文件长度可能很大,因此我们不能只调用 malloc 并分配一大块空间)。我们需要使用 realloc 来扩展释放的内存量,直到到达文件末尾。最终结果应该是一个包含每个字节的长 C 字符串(数组)(如果空字节是文件的一部分,我们也不能忽略它们)。我现在拥有的是:

   char *buff;
   int n = 0;
   char c;
   int count;

   if (ferror (stdin))
   {
      fprintf(stderr, "error reading file\n");
      exit (1);
   }
   else
   {
      do {   
         buff = (char*) realloc (buff, n+1);
         c = fgetc (stdin);
         buff[n] = c;
         if (c != EOF)
             n++;
     }
       while (c != EOF);
   }
   printf("characters entered: ");
   for (count = 0; count < n; count++)
       printf("%s ", buff[count]);
   free (buff);

它应该继续读取直到文件末尾,每次都会扩展内存,但是当我尝试通过管道输入一个简单的文本文件来运行它时,它告诉我有一个段错误。我不太确定我做错了什么。

请注意,我们可以使用 malloc 等,但我不知道如何实现这一点,因为我们知道需要多少内存。

最佳答案

您在第一次调用 realloc 时使用了未分配的指针 buf。更改为

char *buf = malloc(100);

避免这个问题。

一旦你开始工作,你会发现你的程序效率相当低,每个字符都需要重新分配。考虑以更大的 block 重新分配以减少重新分配的次数。

关于c - 从 stdin 读取(可变长度文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10491769/

相关文章:

具有抽象数据类型的 C 双链表

c - 使用 gtk 的多线程进度条控制

c - libevent 在收到数据包时触发 send

c - 二维数组打印不正确

c - Hp VuGen 11.5 基本相关空白值

java - 与 DriverManager 中的 GetConnection() 方法和 Scanner、System.in 中的 next() 方法相关的线程死锁

c++ - C/C++ 如何在连续两次输入 Enter 后或在 2 个换行符后从 stdin 读取

perl - 在 perl 中,\*STDIN 与 STDIN 相同吗?

assembly - 如何从 x86_64 程序集中的 STDIN 读取输入?

c - FILE 指针与标准输入不兼容