char * read_file(char * filename) {
char * file_contents = malloc(4096 * sizeof(char));
FILE * file;
file = fopen(filename, "r");
fread(file_contents, 4096, sizeof(char), file);
fclose(file);
return file_contents;
}
char * read_flag() {
return read_file("/flag.txt"); // outside of current working directory ;)
}
int main(int argc, char* argv[]) {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
char * flag = read_flag();
char input_filename[40];
//Current directory is /home/problem
printf("Current working directory is: ");
system("pwd");
printf("Enter a filename to print the contents of the file => ");
scanf("%39s", input_filename);
while ((directory_entry = readdir(directory)) != NULL) {
if (strcmp(input_filename, directory_entry->d_name) == 0) {
printf("File contents:\n");
printf("%s\n", read_file(input_filename));
return 0;
}
}
}
我需要打开该目录之外的文件(“ /flag.txt”)。我已经尝试在输入中输入类似“ ../”的内容来从该目录中退出,但是它不起作用。我不确定如何输入文件名,以便它可以检索/ home / problem目录之外的文件。我目前正在使用Ubuntu来执行此操作。我认为当我输入输入内容时,该想法应该使用%s%d之类的方法。是否可以使用任何说明符或利用此程序来读取全部内容?
答案 0 :(得分:1)
如果文件位于解决方案目录之外,则需要使用\\
或一个/
将完整路径传递到文件。在基于Windows的系统上,例如为C:\\folder\\file.txt
。我目前不使用linux,但应该为/home/folder/file.txt
。
答案 1 :(得分:0)
fopen
函数可能会失败,因此您应该处理该问题。阅读fopen(3),open(2),path_resolution(7),errno(3),以了解可能的故障原因。详细信息可能是文件系统和计算机特定的(并且可能包括硬件故障)。
我建议在失败时使用perror(3)和exit(3)(不要忘记同时将<stdio.h>
的{{1}}和perror
的{{1}}都包括在内):
<stdlib.h>
然后,您将在失败时收到有意义的错误消息(放入exit
中)
我的猜测:您的根file system(和root directory FILE* file = fopen(filename, "r");
if (!file) {
perror(filename);
exit(EXIT_FAILURE);
}
...)没有stderr
文件,您可能想获取{{ 3}}从/
了解到。也许您想在主目录中检索它(然后在Linux或Unix上使用flag.txt
构建它的文件路径;请参阅shell)。
还要阅读一些Linux编程书籍,也许是旧的glob(7)。