我尝试编写一个代码,该文件从文件读取到没有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;
}
需要一种方法来打破循环if buff[i] == EOF
。
答案 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
。因此,当返回的字节数严格为正时,还有更多工作要做。