以下代码无法编译。在我的视觉工作室中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));
}
}
答案 0 :(得分:5)
STDOUT_FILENO
在unistd.h
中定义,因此您需要
#include <unistd.h>
在顶部与其他#include
s。
编辑:请注意,unistd.h
和扩展名STDOUT_FILENO
是POSIX标准的一部分,适用于Unix系统。鉴于您使用的是Visual Studio,我假设您正在运行Windows,因此无法在该计算机上使用POSIX内容。
话虽这么说,实际上可能存在的问题是你在该行传递的参数看起来不像是fwrite
,它们看起来像是write
的参数,是{em>还在unistd.h
中定义。
在我看来,您的原始问题是使用open
,read
和write
等功能,我认为这些功能都是POSIX(因此无法在Windows上完成)。然后,当您遇到编译问题时,您尝试将其替换为fopen
,fread
和fwrite
,而不更改参数以匹配新函数。
如评论中所述,如果您要使用fopen
,fread
和fwrite
(可以在Windows上使用,并且包含在stdio.h
),请务必正确使用它们。
答案 1 :(得分:1)
这里有很多错误:
void main()
- 这不是我们在C中定义main()
的方式,main()
会返回int
。
gets(file_name);
- 从不使用gets()
,它总是很糟糕,而且它甚至不再是C的一部分。
fd = fopen(file_name, "O_RDONLY");
- fopen()
的无效模式,O_RDONLY
(不是字符串)与open()
一起使用
if (fd < 0)
- fd
是FILE *
,您无法将其与零进行比较,即使您这样做也不会小于零,{{ 1}}失败时返回fopen()
。
NULL
- 完全错误地使用num_read = fread(fd, ch, sizeof(ch));
,再次将您与fread()
混淆,即便如此,第二个参数应该是指向缓冲区的指针,并且你传给它一个read()
。
char
- 只是,为什么?这应该是if (num_read < '0')
,而不是0
。在使用ASCII字符集的实现中,每次读取少于48个字符时,即使您修复了所有其他错误,也会退出程序。 '0'
还会返回一个fread()
,这是一个无符号值,因此它永远不会小于size_t
,除非您阅读超过21亿个字符且0
溢出,在这种情况下,除了你试图在一个num_read
中存储超过21亿个字符的问题之外,你还会得到未定义的行为。
char
- 与fwrite(STDOUT_FILENO, ch, sizeof(ch));
完全相同的问题,您将其与fread()
混淆,仍然只传递一个write()
。