如何知道它是不是没有stdio.h的EOF?

时间:2017-02-13 01:34:31

标签: c io

问题

我尝试编写一个代码,该文件从文件读取到没有stdio.h的stdout。 问题是该文件不会在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;
}

代码说明

  1. 包含上面的代码导入:open(),read()和write() 这些函数都是linux系统调用。
  2. 目前缓冲区大小为1024。
  3. EOF 未知。
    • 尝试(-1),因为它在stdio.h中定义
    • 尝试了CTRL + D和CTRL + C的0x03和0x04十六进制代码。
    • 尝试了CTRL + Z的0x1a十六进制代码。
  4. file_desc是一个整数类型,存储文件名为argv [1]的文件描述符。
  5. 将file_desc数据读入缓冲区。
  6. 从缓冲区写入STDIN的循环,该缓冲区为1,直到缓冲区为EOF。
  7. 我想要什么?

    需要一种方法来打破循环if buff[i] == EOF

2 个答案:

答案 0 :(得分:0)

没有名为“EOF”的角色。某些终端有一个字符,它们会转换为文件结束指示,但您不在此处使用终端。 read的返回值会告诉您读取了多少个字符。

答案 1 :(得分:0)

此代码从命名文件中读取并写入标准输出,而不使用<stdio.h>进行这些操作。它使用fprintf(stderr, …)报告错误,因为编写等效代码以使用普通write()是非常令人沮丧的 - 除非你使用POSIX函数dprintf(),但是在<stdio.h>中声明了,即使它不使用文件流。

#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的关键点是read()在检测到EOF时返回0字节读取,或者在错误时返回-1。因此,当返回的字节数严格为正时,还有更多工作要做。