Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何知道没有stdio.h是否为EOF? 问题_C_Io - Fatal编程技术网

C 如何知道没有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

我试图编写一个代码,在没有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_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,这是不可靠的—只是偶然发生的,而且是在一些比较奇怪的情况下。