2016-07-02 9 views
2

Ich habe hier Probleme mit meinem Dateinamen. Ich fange gerade an, Programmargumente zu verwenden, und ich bin bereits mit dem Konvertieren fest. Ich schreibe ein Programm, das Argument, wie dies geschieht: ./sum filename und von filename.txt es Daten nimmt und so tut. Das Problem, das ich habe, ist, wie kann ich Dateiname zu "filename.txt" für fopen ändern, um es zu akzeptieren?Wie ändere ich die Namensfolge der Datei in ein Format, das von fopen akzeptiert werden kann

#include <stdio.h> 

char *wrap_fname (const char *); 

int main(int argc, char* argv[]){ 
    FILE *filePtr = NULL; 

    printf("\n%s\n", wrap_fname(argv[1])); 
    getchar(); 
} 

char *wrap_fname (const char *name){ 
    char *wrapped_name = NULL; 
    int iterator; 

    *wrapped_name = '"'; 
    for(iterator = 0 ; iterator < strlen(*name) ; iterator ++){ 
    wrapped_name[iterator+1] = name[iterator]; 
    } 

    wrapped_name[strlen(wrapped_name)] = ".txt\""; 

    return wrapped_name; 
} 

Ich habe schon so etwas gemacht, aber ich weiß, das ist nur ein verzweifelter Versuch. Jede Hilfe wäre willkommen, da ich dafür keine gute Funktion finden konnte.

- EDIT - Ich habe endlich die Funktion arbeiten, jetzt sieht mein Code wie folgt aus:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void wrap_fname (char * , char **); 

/***************************************************************************/ 

int main(int argc, char* argv[]){ 
    FILE *filePtr = NULL; 
    char *filename = malloc(sizeof(argv[1])+6*sizeof(char)); 

    wrap_fname(argv[1],&filename); 

    if((filePtr = fopen(filename,"r")) == NULL){ 
    perror("Error opening file..."); 
    exit(3); 
    } 
    printf("File %s succesfully opened",filename); 

    getchar(); 
    free(filename); 
    return 0; 
} 

/***************************************************************************/ 

void wrap_fname (char *name , char **dest){ 
    char *wrapped_name = malloc(sizeof(name)+6*sizeof(char)); 

    strcat(wrapped_name,"\""); 
    strcat(wrapped_name,name); 
    strcat(wrapped_name,".txt\""); 
    strcpy(*dest,wrapped_name); 

    free(wrapped_name); 
} 

Und jetzt habe ich ein größeres Problem, das ich absolut keine Ahnung, wie zu behandeln. Nachdem ich es mit ./sum data (nach dem Erstellen dieser Datei in meinem Ordner) laufen wandeln sie Namen richtig "data.txt" aber fopen es nicht öffnen und ich bekomme ein perrorno such file or directory. Irgendeine Möglichkeit, es zum Laufen zu bringen?

+2

[strcat] (http://linux.die.net/man/3/strcat) kann helfen Sie. Aber vorher müssen Sie wahrscheinlich zurückgehen und die grundlegende Speicherzuweisung in C überarbeiten - 'char * wrapped_name = NULL; * Wrapped_name = '".';' Wird nicht gut enden (dereferencing NULL-Zeiger) – kaylum

+1

'strlen (* name)' sollte 'strlen (name)' sein zu beachten, dass Sie nicht 'Rückkehr wrapped_name;.' Es sei denn, es ist entweder ein 'static' Array oder Speicher dynamisch zugewiesen hat. –

+1

Yesss, danke Kaylum, es ist wie ein Charme :) und ja ich weiß, dass dieser Code viele Fehler, die alle inzwischen korrigiert :) – Animu

Antwort

1

Ich habe die Wrapping-Funktion so korrigiert, dass es keine Anführungszeichen mehr hinzufügt und es funktioniert wie ein Charme :) Danke für den Kommentar über sizeof(argv[1]), ich habe das nicht wirklich durchdacht. Wie dem auch sei hier arbeitet Code dieses Programms:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 

void wrap_fname (char * , char **); 
FILE *open_file (char *); 

/***************************************************************************/ 

int main(int argc, char* argv[]){ 
    FILE *filePtr = NULL; 
    char *filename = malloc(strlen(argv[1])*sizeof(char)+6*sizeof(char)); 

    wrap_fname(argv[1],&filename); 

    filePtr = open_file(filename); 
    printf("File %s succesfully opened",filename); 

    getchar(); 
    fclose(filePtr); 
    free(filename); 
    return 0; 
} 

/***************************************************************************/ 

void wrap_fname (char *name , char **dest){ 
    char *wrapped_name = malloc(strlen(name)*sizeof(char)+6*sizeof(char)); 

    strcat(wrapped_name,name); 
    strcat(wrapped_name,".txt"); 
    strcpy(*dest,wrapped_name); 

    free(wrapped_name); 
} 

/***************************************************************************/ 

FILE *open_file(char *path){ 
    FILE *tmp_ptr = NULL; 

    if(!access(path, F_OK)){ 
    if (!(tmp_ptr = fopen (path, "r"))) 
    { 
     perror ("Error opening file..."); 
     exit (1); 
    } else return tmp_ptr; 
    } else { 
    perror("File doesnt exist..."); 
    exit(3); 
    } 
    return NULL; 
} 

/***************************************************************************/ 

Wirklich danke euch für eure Hilfe :)

+1

Nur ein Punkt, Sie don Der Code muss nicht mit 'sizeof (char)' durcheinander gebracht werden, weil er definitionsgemäß '1' ist. –

Verwandte Themen