2016-04-03 7 views
0

Ich muss eine Datei auf dem Desktop (Linux) öffnen. Wenn ich den Ort als String innerhalb der Funktion fopen() schreibe, funktioniert es, aber wenn ich es als Variable übergebe, funktioniert es nicht. Hier ist mein Code:C kann Datei nicht mit einer Variablen öffnen

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); 
} 

Wenn ich es so schreiben, es zeigt mir den Inhalt der Datei:

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); 
    } 

Das Kind Prozess die Datei öffnet. Hier ist mein vollständiger Code

#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; 
} 
+5

Zeigen Sie uns, wie Sie 'readPathToFile' deklarieren und zuweisen. –

+0

Sie müssen in readPathToFile etwas falsch übergeben. – 4pie0

+5

Wild assessed rate: 'readPathToFile' enthält am Ende einen Zeilenumbruch. – Jens

Antwort

1

Ihr Compiler nicht Sie warnt vor dem Typenkonflikt in

char *pathToFile[100]; 
fgets(pathToFile, 100, stdin); 

(Array von 100 Zeigern-to-char gegen Array mit 100 Zeichen)? Hast du Warnungen ausgeschaltet?

Beachten Sie auch, dass fgets den Zeilenumbruch behält. Ihr Dateiname endet wahrscheinlich nicht mit einem Zeilenumbruch. Sie sollten es durch ein NUL (Null) Byte ersetzen.

Normalerweise benötigen Sie keinen Debugger, um diese zu verfolgen. Ein bisschen printf Debugging kann Wunder tun. :-)

+0

Wenn OP seine Debugger-Umgebung nicht repariert, wird es nächste Woche erneut gepostet :( –

1

Okay, so ist dies die Wurzel des Problems:

char *pathToFile[100]; 

Dies erklärt pathToFile als 100-Element-Array von Zeigern zu char, keine 100-Element-Array von char. Das erste, was Sie tun müssen, ist diese Erklärung Zweitens

char pathToFile[100]; 

zu

ändern, fgets wird das hintere Newline aus Ihrer Eingabe an den Zielpuffer speichern, wenn es Raum, so dass Sie, dass Newline von dem Eingang entfernen benötigen :

char *newline = strchr(pathToFile, '\n'); 
if (newline) 
    *newline = 0; 
Verwandte Themen