0

下面的代码无法编译。在我的 Visual Studio 中的 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));
     }

}
4

2 回答 2

5

STDOUT_FILENO中定义unistd.h,所以你需要

#include <unistd.h>

#include与其他s在顶部。

编辑:请注意,unistd.h, 和扩展STDOUT_FILENO是 POSIX 标准的一部分,该标准适用于 Unix 系统。鉴于您使用的是 Visual Studio,我假设您正在运行 Windows,因此不能在该机器上使用 POSIX 的东西。


话虽这么说,实际问题可能是您在该行上传递的参数看起来不像它们是 for fwrite,它们看起来像参数write,这也在unistd.h.

在我看来,您最初的问题是使用诸如open,read和之类的函数write,我相信它们都是 POSIX(因此无法在 Windows 上完成)。然后,当您遇到编译问题时,您尝试将它们替换为fopen, fread, 并且fwrite不更改参数以匹配新函数。

正如评论中提到的,如果您想使用fopenfreadfwrite可以在 Windows 上使用并包含在 中stdio.h),请务必正确使用它们。

于 2013-10-08T02:59:49.303 回答
1

有这么多错误,这里:

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

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

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

  4. if (fd < 0)-fd是 a FILE *,你不能将它与零进行比较,即使你这样做,它也永远不会小于零,失败时fopen()返回NULL

  5. num_read = fread(fd, ch, sizeof(ch));- 完全错误的用法fread(),您再次read()将其与char.

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

  7. fwrite(STDOUT_FILENO, ch, sizeof(ch));- 与 with 完全相同的问题fread(),您将它与 混淆write(),并且仍然将它传递给单个char.

于 2013-10-08T03:43:07.623 回答