C无法使用变量打开文件

时间:2016-04-03 13:17:30

标签: c linux

我需要打开位于桌面(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;
}

2 个答案:

答案 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;