C 如何知道没有stdio.h是否为EOF? 问题
我试图编写一个代码,在没有stdio.h的情况下从文件读取到标准输出。 问题是文件不会在EOF时停止 代码如下:C 如何知道没有stdio.h是否为EOF? 问题,c,io,C,Io,我试图编写一个代码,在没有stdio.h的情况下从文件读取到标准输出。 问题是文件不会在EOF时停止 代码如下: #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define BUFF_SIZE 1024 #define EOF ??? int main(int argc, char * argv[]){ int file
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFF_SIZE 1024
#define EOF ???
int main(int argc, char * argv[]){
int file_desc = open(argv[1], O_RDWR);
char buff[BUFF_SIZE];
read(file_desc, buff, BUFF_SIZE);
int i = 0;
while ( buff[i] != EOF){
write(1, &buff[i], 1);
i++;
}
return 0;
}
代码解释
包括以上代码导入:打开、读取和写入
所有linux系统调用的函数。
目前,缓冲区大小为1024。
EOF未知。
按stdio.h中的定义尝试-1
尝试了CTRL+D和CTRL+C的0x03和0x04十六进制代码。
尝试了CTRL+Z的0x1a十六进制代码。
file_desc是一种整数类型,用于存储文件名为argv[1]的文件描述符。
正在将文件描述数据读入缓冲区。
从缓冲区写入标准数据的循环,在缓冲区为EOF之前为1。
我想要什么?
如果buff[i]==EOF,则需要一种方法来中断循环。没有称为EOF的字符。有些终端有一个字符,它们可以转换为文件结束指示,但这里您不使用终端。read的返回值告诉您读取了多少个字符。此代码从命名文件读取并写入标准输出,而不使用这些操作。它使用fprintfstderr,…来报告错误,因为编写等价的代码来使用纯写是有点令人沮丧的-除非您使用POSIX函数,但这是在中声明的,即使它不使用文件流
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#define BUFF_SIZE 1024
int main(int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "Usage: %s file\n", argv[0]);
return 1;
}
int fd = open(argv[1], O_RDONLY);
if (fd < 0)
{
fprintf(stderr, "%s: failed to open file '%s' for reading\n", argv[0], argv[1]);
return 1;
}
char buff[BUFF_SIZE];
int nbytes;
while ((nbytes = read(fd, buff, BUFF_SIZE)) > 0)
write(STDOUT_FILENO, buff, nbytes);
close(fd);
return 0;
}
检测EOF的关键点是,当检测到EOF时,返回读取的0字节,或者在错误时返回-1。因此,当返回的字节数严格为正时,还有更多的工作要做。读取函数不会将EOF存储在buff中。相反,它返回成功读取的字符数或错误代码。检查文档的可读性。甚至不要重新定义标准宏。如果需要宏,请包含在中定义的头文件。但正如@M.M告诉你的,你在这里不需要它。此外,即使使用标准的C I/O函数,它们也不会将EOF放入数据中,而是从函数返回。你真的需要阅读一些手册和教程。当字符未签名时,while buff[i]!=EOF是一个无限循环。请检查read的返回值。我认为您应该使用O_RDONLY打开文件;你不会写信给它的。您应该检查打开是否成功。您应该捕获读取的字节数并进行检查。你不应该写单个字节。如果输入大于缓冲区大小,则需要一个循环,除非您希望在终端上有一行输入。正如其他人指出的那样,您在EOF检测方面存在问题—您至少不会在缓冲区中找到EOF,这是不可靠的—只是偶然发生的,而且是在一些比较奇怪的情况下。