在C.编译错误中读取文件

时间:2013-10-08 02:57:05

标签: c

以下代码无法编译。在我的视觉工作室中STDOUT_FILENO下有一条卷曲的线条,并没有提供任何关于如何纠正它的建议。

#include <stdio.h>
#include <stdlib.h>
#include "read_file.h"

void main()
{
   char ch, file_name[25];
   //FILE *fp;
   FILE *fd;
   int num_read;

   printf("Enter the name of file you wish to see\n");
   gets(file_name);

   fd = fopen(file_name, "O_RDONLY");
   if (fd < 0)
     {
           perror("Error while opening the file.\n");

       exit(EXIT_FAILURE);
     }
   printf("The contents of %s file are :\n", file_name);

   for (;;)
     {
           num_read = fread(fd, ch, sizeof(ch));
           if (num_read < '0')
             {
               perror("Error while reading the file.\n");
               exit(EXIT_FAILURE);
             }
           if (num_read == 0)
             {
               break;
             }
               fwrite(STDOUT_FILENO, ch, sizeof(ch));
     }

}

2 个答案:

答案 0 :(得分:5)

STDOUT_FILENOunistd.h中定义,因此您需要

#include <unistd.h>

在顶部与其他#include s。

编辑:请注意,unistd.h和扩展名STDOUT_FILENO是POSIX标准的一部分,适用于Unix系统。鉴于您使用的是Visual Studio,我假设您正在运行Windows,因此无法在该计算机上使用POSIX内容。


话虽这么说,实际上可能存在的问题是你在该行传递的参数看起来不像是fwrite,它们看起来像是write的参数,是{em>还在unistd.h中定义。

在我看来,您的原始问题是使用openreadwrite等功能,我认为这些功能都是POSIX(因此无法在Windows上完成)。然后,当您遇到编译问题时,您尝试将其替换为fopenfreadfwrite,而不更改参数以匹配新函数。

如评论中所述,如果您要使用fopenfreadfwrite可以在Windows上使用,并且包含在stdio.h),请务必正确使用它们。

答案 1 :(得分:1)

这里有很多错误:

  1. void main() - 这不是我们在C中定义main()的方式,main()会返回int

  2. gets(file_name); - 从不使用gets(),它总是很糟糕,而且它甚至不再是C的一部分。

  3. fd = fopen(file_name, "O_RDONLY"); - fopen()的无效模式,O_RDONLY(不是字符串)与open()一起使用

  4. if (fd < 0) - fdFILE *,您无法将其与零进行比较,即使您这样做也不会小于零,{{ 1}}失败时返回fopen()

  5. NULL - 完全错误地使用num_read = fread(fd, ch, sizeof(ch));,再次将您与fread()混淆,即便如此,第二个参数应该是指向缓冲区的指针,并且你传给它一个read()

  6. char - 只是,为什么?这应该是if (num_read < '0'),而不是0。在使用ASCII字符集的实现中,每次读取少于48个字符时,即使您修复了所有其他错误,也会退出程序。 '0'还会返回一个fread(),这是一个无符号值,因此它永远不会小于size_t,除非您阅读超过21亿个字符且0溢出,在这种情况下,除了你试图在一个num_read中存储超过21亿个字符的问题之外,你还会得到未定义的行为。

  7. char - 与fwrite(STDOUT_FILENO, ch, sizeof(ch));完全相同的问题,您将其与fread()混淆,仍然只传递一个write()