我正在使用
O_RDWR
打开文件并提供描述符,然后使用带有"r+"
的fdopen()
中的描述符。我首先使用access()
检查文件是否存在,然后检查open()
返回-1,然后检查从fdopen()
设置的FILE *fp
不为NULL
。
现在,每当我使用fp
的任何函数,如fgets()
或fgetc()
,程序就会在终端中挂起。我没有收到编译器警告。有什么想法吗?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv) {
char buffer[512];
int file_descriptor;
FILE *file;
if (argc != 2) {
puts("ERROR: Missing argument");
exit(0);
}
else if (access(argv[1], F_OK) == -1) { // Check if file exists
puts("ERROR: File does not exist");
exit(0);
} else if (file_descriptor = open(argv[1], O_RDWR) == -1) { // Check for open() failure
puts("ERROR: Unable to open file using open()");
exit(0);
}
file = fdopen(file_descriptor, "r+"); // Use descriptor
if (file == NULL) {
puts("ERROR: Unable to open file using fdopen()");
fclose(file);
exit(0);
}
// fscanf(file, "%c", stdout); // Hangs
// fgets(buffer, sizeof(buffer), file); // Hangs
printf("%c", fgetc(file)); // Hangs
fclose(file);
return 0;
}
fopen
代替open
+fdopen
。同时,clang
给出了一堆警告,指出你正在使用open
的方式不正确。 - Schwerncc -Wall
命令来开启。如果你的教授没有告诉你这个,那他们真是太不负责任了。我建议你使用C99标准的-std=c99
选项,并避免过度依赖GNU扩展。最后,我的建议是现在就学习valgrind。 - Schwern