我需要打开位于桌面(Linux)上的文件。如果我在fopen()函数中将该位置写为字符串,它可以工作,但如果我将它作为变量传递,它就不起作用。这是我的代码:
fp = fopen(readPathToFile, "r");
if (!fp){
printf("Failed to open text file\n");
exit(1);
}
else{
fscanf(fp,"%s",line);
printf("File read: %s",line);
}
如果我这样写,它会显示文件的内容:
fp = fopen("home/user/Desktop/test.txt", "r");
if (!fp){
printf("Failed to open text file\n");
exit(1);
}
else{
fscanf(fp,"%s",line);
printf("File read: %s",line);
}
子进程打开文件。这是我的完整代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#define READ 0
#define WRITE 1
int main ()
{
pid_t pid;
int mypipefd[2];
id_t child_pid;
char line[100];
char *pathToFile[100];
FILE *fp;
char buff[255];
/* create the pipe */
if (pipe(mypipefd) == -1) {
fprintf(stderr,"Pipe failed");
return 1;
}
child_pid = fork () ;
if (child_pid > 0) {
printf("Introduceti locatia catre fisier:");
fgets(pathToFile, 100, stdin);
close(mypipefd[READ]);
write(mypipefd[WRITE], &pathToFile, sizeof(pathToFile));
close(mypipefd[WRITE]);
printf("parent: write value : %s",pathToFile);
}
else if (child_pid < 0) {
fprintf(stderr, "Fork failed");
return 1;
}
else{
char *readPathToFile[100];
close(mypipefd[WRITE]);
read(mypipefd[READ], &readPathToFile, sizeof(readPathToFile));
close(mypipefd[READ]);
printf("child: read value : %s",readPathToFile);
fp = fopen(readPathToFile, "r");
if (!fp)
{
printf("Failed to open text file\n");
exit(1);
}
else{
fscanf(fp,"%s",line);
printf("File read: %s",line);
}
}
return 0;
}
答案 0 :(得分:1)
您的编译器没有警告您
中的类型不匹配char *pathToFile[100];
fgets(pathToFile, 100, stdin);
(100个指针到char的数组与100个字符的数组)?你关闭警告了吗?
另请注意,fgets
会保留换行符。您的文件名可能不会以换行符结尾。您应该用NUL(零)字节替换它。
通常,您不需要调试器来跟踪这些问题。一点printf
调试可以创造奇迹。 : - )
答案 1 :(得分:1)
好的,这是你问题的根源:
char *pathToFile[100];
这将pathToFile
声明为指针的<100>元素到char
,而不是char
的100个元素数组。您需要做的第一件事是将声明更改为
char pathToFile[100];
其次,fgets
会将输入中的尾随换行符保存到目标缓冲区(如果有空间),因此您需要从输入中删除该换行符:
char *newline = strchr( pathToFile, '\n' );
if ( newline )
*newline = 0;