[英]when I try to read from txt file it returns : Cannot read input file
I am trying to write a program that compares 2 files and return if their equal or not. 我正在尝试编写一个比较2个文件并返回相等或不相等的程序。
I can only use the functions: fork, dup, dup2, open, write, exec, read. 我只能使用以下功能:fork,dup,dup2,open,write,exec,read。
When I compile the program on linux gcc, it returns Cannot read input file 当我在linux gcc上编译程序时,它返回无法读取输入文件
shay@shay-Latitude-E6410 ~/workspace/targ1OS $ ./comp.out input.txt input.txt Cannot read input file
the code: 编码:
/*
* This function checks if the files are similar or similar by case sensitive
* it gets 2 files, and returns: 3 if identical, 2 if identical but only if not
* case sensitive or 1 else.
*/
int CheckSimilar(char *path1, char *path2){
//open the files
int fd1 = open(path1, O_RDONLY), fd2 = open(path2, O_RDONLY);
int flag = 1;//this flag is to check for case sensitive
char *firstFile = NULL, *secondFile = NULL;
int readBytes, read2ndFile;
if (fd1 == -1 || fd2 == -1){
write(2, "Cannot open input file\n", 24);
return -1;//checks if there is a problem opening the file
}
while (1){
readBytes = read(fd1, firstFile, 1);
read2ndFile = read(fd2, secondFile, 1);
if (readBytes < 0 || read2ndFile < 0){
write(2, "Cannot read input file\n", 24);
return -1;
}//checks if there is a problem reading chars from the file
if (!readBytes || !read2ndFile)
break;
if (*firstFile == *secondFile)
continue;//the chars are equal
//checks if it's an abc char
else if ((*firstFile > 64 && *firstFile < 91) ||
(*firstFile > 96 && *firstFile < 123)){
// checks for not case sensitive
if ((*firstFile - *secondFile) == 22 ||
(*firstFile - *secondFile) == -22)
flag = 0;
}
else
return 1;
}
close(fd1);
close(fd2);
if (readBytes != read2ndFile)
return 1;
if (flag)
return 2;
return 3;
}
Make yourself a better world and ask the system about errno
, and read the manual about the system calls read(2), open(2),... and errno(3) 让自己变得更美好,向系统询问errno
,并阅读有关系统的手册,调用read(2),open(2),...和errno(3)
(read(2) for example is a manual page address, saying: Manual page "read" in section 2, read man man
about sections). (读取(2)例如是手动页面地址,他说:手册页“阅读”第2条,读man man
约章节)。
#include <stdio.h>
#include <string.h>
#include <errno.h>
[...]
char* err = strerror(errno);
char* errlen = err ? strlen(err): 0;
char* form = "Cannot read input file since \"%s\".\n"
if (errlen == 0) {
form = "Cannot read input file failed with unknown error %d.\n";
fprintf(stderr, form, errno);
}
else {
fprintf(stderr, form, err);
}
As you cannot use fprintf, I leave it for you to write the forms. 由于您无法使用fprintf,因此我将其留给您编写表单。 At least you should print out the errno
after the failed read. 读取失败后,至少应该打印出errno
。
The problem is here: 问题在这里:
You declare: 您声明:
char *firstFile = NULL, *secondFile = NULL;
and then you use 然后你用
read(fd1, firstFile, 1);
when firstFile
is NULL
, and therefore read
fails. 当firstFile
为NULL
,因此read
失败。
Declare firstFile
and secondFile
like this: 像这样声明firstFile
和secondFile
:
char firstFile[1];
char secondFile[1];
检查文件是否存在于给定的路径中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.