fopen() und datei namensgebung



  • hallo liebe forengemeinde,
    ich bin neu hier in diesem forum und versuche seit anfang juni mir das programmieren ein wenig anzueignen.ich habe mir bereits diverse literatur zum thema c/c++ und java programmierung gekauft.

    So nun zu meinem problem:und zwar würde ich gerne beim öffen einer datei den namen des zu erstellenden textdokuments variabel machen,sprich der anwender soll was über stdin eingeben,was in einer variabel gespeichert wird und dann der name in fopen() wird.
    habe mir das anfangs so vorgestellt aber der compiler(gcc unter codeblocks)sagt es sind zuviele parameter für fopen :-(.

    int main(void) {
    char string[20];
    char *stringptr;
    FILE *datei;
    printf("Geben Sie den Baustellen Namen ein: ");
    scanf("%s", &string);
    stringptr =&string;
    datei = fopen("%s.txt", "w+", stringptr);
    if(NULL == datei) {
    printf("Konnte /test1.txt/ nicht Oeffnen\n");
    return EXIT_FAILURE;
    }
    else{
    fprintf(datei, stringptr);
    fclose(datei);
    }
    return EXIT_SUCCESS;
    }

    und jetzt meine frage:kennst jemand nen lösungsansatz oder nen stichwort das mir auf die sprünge helfen könnte????

    wahrscheinlich ist es nichts großartiges aber irgendwie bin ich nicht fündig geworden.
    vielen dank für eure hilfe.



  • Formatspecifier (wie %s) sind eine Eigenschaft von wenigen Funktionen (scanf, printf, strftime) der Standardlibrary.
    Das ist keine Spracheigenschaft.

    Funktionen die eine variable Parameterliste haben, haben auch ... im Prototyp.
    fopen() gehört nicht dazu.

    Du kannst strcat() benutzen oder den Namen mit sprintf() neu zusammen basteln.

    Das stringptr =&string; ist auch überflüssig, da der Name des Arrays (hier string) schon für die Adresse steht.

    Packe beim nächsten mal deinen Quelltext bitte zwischen cpp-Tags:
    Code markieren und den C/C++ Button unter den 🙂 😃 😉 anklicken.



  • Hier mal zu fopen:
    http://www.cplusplus.com/reference/clibrary/cstdio/fopen/

    Scheinbar willst du Dateinamen ohne Endung z.B. "?.txt" eingeben. Dein Programm soll das richten.
    Bei C schau dir dann mal folgendes an:
    http://www.cplusplus.com/reference/clibrary/cstring/strcat/



  • Erstmal tausend dank an euch beiden, ich werd mich mal durch die beiden links kämpfen und die funktion des ersten beitrages genauer unter die lupe nehmen.
    und sorry aber noch ne frage:wieso gibt der compiler bei der übersetzung immer folgende warnung???

    warnig: assignment from incompatible pionter type?



  • negaduck schrieb:

    und sorry aber noch ne frage:wieso gibt der compiler bei der übersetzung immer folgende warnung???

    warnig: assignment from incompatible pionter type?

    Solche Fehlermeldungen sind mit einer Zeilennummer versehen.*
    Da musst du mal schauen, in welcher Zeile der Fehler auftritt und dann noch die Definition der dort genannten Zeiger.

    *Die Zeilennummer nützt uns hier wenig, da dein Code oben keine enthält.
    Die gibt es mit den cpp-Tags.

    Noch ein paar Sachen:

    Bei scanf solltest du immer die Länge für den String begrenzen:

    scanf("%19s", string);
    

    fprintf erwartet an zweiter Stelle einen Formatstring.
    Wenn du nur einen String ausgeben willst, solltest du auch den Formatstring dafür nutzen:

    fprintf(datei,"%s",stringptr);
    

    oder noch besser, die geeignete Funktion dafür wählen:

    fputs(stringptr,datei);
    


  • also ich hab die ratschläge soweit ich sie umsetzen konnte eingebracht allerdings hab ich das wichtigste nicht ganz gerallt.
    hab meine bücher zu den funktionen sprintf() und strcat() mal durchgeblättert und irgendwie ist der funke nicht übergesprungen.

    sollte ich in dem ersten parameter von fopen dann die entsprechende funktion und deren parameter eingeben??

    der code

    #include<stdio.h>
    #include<stdlib.h>  
    
    int main(void) {
        char string[20];
        FILE *datei;
        printf("Geben Sie den Baustellen Namen ein: ");
        scanf("%19s", &string);
        datei = fopen("NAME.txt", "w+");
        if(NULL == datei) {
          printf("Konnte /%s.txt/ nicht Oeffnen\n", string);
          return EXIT_FAILURE;
          }
         else{
             fputs(string, datei);
    		 fclose(datei);
             }
         return EXIT_SUCCESS;
    }
    


  • int main(void) {
    //    char string[24]; // 19 Zeichen + ".txt" + '\0'
        char dateiname[24]; // beserer Variablenname
        FILE *datei;
    
        printf("Geben Sie den Baustellen Namen ein: ");
        scanf("%19s", dateiname); // Das  & ist nicht noetig (und bei Zeigern auch falsch)
        strcat(dateiname, ".txt");  // ".txt" an dateiname anhaengen
        datei = fopen(dateiname, "w+");  // sicher das du + möchtest.
    

    Wenn du allerdings nochmal den Dateinamen ohne .txt willst, solltest du mit einer Kopie arbeiten.

    int main(void) {
        char dateiname[256];    
        char dateinametxt[256]; 
        FILE *datei;
    
        printf("Geben Sie den Baustellen Namen ein: ");
        scanf("%250s", dateiname); 
        strcpy(dateinametxt, dateiname);  // dateiname kopieren
        strcat(dateinametxt, ".txt");     // ".txt" an dateiname anhaengen
        datei = fopen(dateinametxt, "w");
    


  • Da wäre ich nicht drauf gekommen,echt super nett von dir.
    der compiler hat zwar für zeile 9 eine warnung raus aber es hat geklappt.
    nochmal danke Dirk!!!!



  • negaduck schrieb:

    Da wäre ich nicht drauf gekommen,echt super nett von dir.

    So ist es aber auch im 2. Link von f.-th. beschrieben 😕

    negaduck schrieb:

    der compiler hat zwar für zeile 9 eine warnung raus aber es hat geklappt.

    Wenn du jetzt noch den genauen Text der Warnung nennst, kann man die auch sagen, was die bedeutet.
    Lies dir mal http://www.c-plusplus.net/forum/136013 durch.

    negaduck schrieb:

    nochmal danke Dirk!!!!

    Kein Problem



  • Entschuldige nochmals ich wollte nicht unangenehm auffallen durch schlechtes verhalten.

    zeile 9 warning: incompatible implicit declaration of built-in function 'strcat'



  • Der Compiler kennt die Funktion strcat (noch) nicht. D.h er weiss nicht, welche Paramter sie erwartet.

    strcat() ist in der Standard-Headerdatei string.h deklariert.
    Diese musst du noch am Anfang vom Programm einbinden mit

    #include <string.h>
    

    Ob das vor oder nach dem <stdio.h> passiert ist egal.



  • negaduck schrieb:

    Entschuldige nochmals ich wollte nicht unangenehm auffallen durch schlechtes verhalten.

    Die wenigsten haben hier Glaskugeln* in denen zu sehen ist, was bei dir passiert.
    Also sind wir auf deine Angaben angewiesen.
    Und es ist immer wieder ziemlich mühsam danach zu fragen.
    Denn du bist ja nicht der Einzige, der sich am Anfang scheut seine Informationen raus zu lassen.

    *oder andere ähnliche Medien.



  • Sind meine ersten posts in foren aber das soll nicht als entschuldigung dienen ich werd mich ab jetzt immer versuchen alles mit anzugeben.

    irgendwie treten bei mir ein kleines problem nach dem anderen auf *rotwerd.
    wie schreibt man denn die fopen() parameter mit pfandangabe und variablen textname??

    als erstes hab ich es so versucht:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main() {
    
        int *array;
        int *material;
        array = malloc(7 * sizeof(int));
        material = malloc(12 * sizeof(int));
    	char dateiname[54];
        FILE *datei;
        printf("Geben Sie den Baustellen Namen ein: ");
    	fflush(stdin);
        scanf("%49s", dateiname);
        strcat(dateiname,".txt");
        datei = fopen("c:\\Users\\Alex\\Desktop\\Baustellen\\dateiname", "w+");
        if(NULL == datei) {
          printf("Konnte /%s.txt/ nicht Oeffnen\n", dateiname);
          return EXIT_FAILURE;
          }
         else{
    		 fclose(datei);
    	    }
    return EXIT_SUCCESS;
    

    dann erstellt er allerdings ne datei mit namen dateiname

    dann hab ich es mal so versucht

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main() {
    
        int *array;
        int *material;
        array = malloc(7 * sizeof(int));
        material = malloc(12 * sizeof(int));
    	char dateiname[54];
        FILE *datei;
        printf("Geben Sie den Baustellen Namen ein: ");
    	fflush(stdin);
        scanf("%49s", dateiname);
        strcat(dateiname,".txt");
        datei = fopen("c:\\Users\\Alex\\Desktop\\Baustellen\\"dateiname"", "w+");
        if(NULL == datei) {
          printf("Konnte /%s.txt/ nicht Oeffnen\n", dateiname);
          return EXIT_FAILURE;
          }
         else{
    		 fclose(datei);
    	    }
    return EXIT_SUCCESS;
    

    Da hat sich der compiler beschwert.
    zeile 19 error: expected ')' before 'dateiname'
    zeile 19 error: too few arguments to function 'fopen'

    den zweiten error versteh ich ja aber den ersten irgendwie nicht und die richtige schreibweise find ich in meinem büchern leider auch nicht 😞



  • negaduck schrieb:

    wie schreibt man denn die fopen() parameter mit pfandangabe und variablen textname??
    ...

    datei = fopen("c:\\Users\\Alex\\Desktop\\Baustellen\\dateiname", "w+");
    

    ...
    dann erstellt er allerdings ne datei mit namen dateiname

    Ne, so geht das nicht.

    Das "c:\\Users\\Alex\\Desktop\\Baustellen\\dateiname" ist ein Stringliteral, da alles zwischen " steht. Da wird nichts drin ersetzt.

    Woher soll der Compiler denn sonst wissen, das du jetzt die Variable dateiname meinst und nicht den Text.

    Wenn du das "C:\...." Gedöns haben willst, dann gib es mit ein.

    Oder du kopierst es erst nach dateinametxt .
    Dann hängst du dateiname dran und dann noch mal ".txt".
    Alles nacheinander in einzelnen Schritten.

    Oder mit sprintf:

    sprintf(dateinametxt, "c:\\Users\\Alex\\Desktop\\Baustellen\\%s.txt", dateiname);
    

    Und sei großzügig mit deinen Arrays. Auf einem PC kommt es da auf ein paar Zeichen nicht an.

    ⚠ Die Stringverabeitung ist in C "anderes" als bei den meisten Sprachen.
    Du kannst Strings nicht einfach zuweisen oder mit + oder & verbinden.
    Dazu gibt es strcpy und strcat().



  • oh man tausend dank an dich DirkB.hab die version mit strcat benutz und klappt wunderbar.auch keine warnungen des compilers mehr.



  • Es tut mir echt leid das ich euch hier mit fragen löcher.Ich bin nur totaler Anfänger und meine Bücher liefern mir irgendwie nicht die gesuchten antworten bzw irgendwie kann ich sie nicht verstehen oder umsetzten.

    und zwar will ich einige tabellenartige printf ausgaben noch extra in einem extra angelegten Textdokument speichern.ich kam nur auf eine sehr sehr schlechte Lösung :-(.vielleicht hat ja jemand ne passende Funktion zu der ich mich informieren kann parat.

    der text ist nur ein kleiner ausschnitt:um die entsprechende ausgabe zu erhalten muss 1212 1212 und 2 bei den einzelnen fragen eingegeben werden.

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main(){
    
        int *array ;
        int *material;
        array = malloc(7 * sizeof(int));
        material = malloc(8 * sizeof(int));
        char dateinamentext[100] = {"c:\\Users\\Alex\\Desktop\\Baustellen\\"};
        char dateiname[54];
        FILE *datei;
        printf("Geben Sie den Baustellen Namen ein: ");
    	fflush(stdin);
        scanf("%49s", dateiname);
        strcat(dateiname,".txt");  /* dateiendung *.txt an den namen anhängen*/
        strcat(dateinamentext, dateiname); /* Name des dokuments an den zu speichernden Pfad hängen,DANKE AN DirkB */
        datei = fopen(dateinamentext, "w+"); /* Stream öffnen und datei erstellen*/
        if(NULL == datei) { /* Kontrolle */
          printf("Konnte /%s.txt/ nicht Oeffnen\n", dateiname); 
          return EXIT_FAILURE;
          }
        printf("H\x94he des Geb\x84udes in cm: ");
        scanf("%d", &array[0]);
    	if(array[0] % 200) {
             array[3] = array[0] % 200;
             array[4] = array[0]/200;
             if(array[3] >= 1 && array[3] <=30){
                 printf("%d Lagen\nNormale F\x81sse\n", array[4]);
    			 printf("L\x84nge des Geb\x84udes in cm: ");
                 scanf("%d", &array[1]);
                 printf("Welche Lastklasse wird ben\x94tigt: ");
                 scanf("%d", &array[2]);
                 switch(array[2]){
    
    			     case 2 : if(array[1] % 300) {  /* Diverse Berechnungen mit anschließender Ausgabe Tabellenartig*/
                                 array[5] = array[1] % 300;
                                 array[6] = array[1]/300;
                                 if(array[5] <= 50){
                                     printf("%d Felder\n",array[6]);
                                     material = malloc(8 * sizeof(int));
    	                             material[0] = ((array[6]*array[4])*2)-(array[4]*2);
                                     material[1] = (array[6]+1)*2;
                                     material[2] = (array[6]*2*array[4])+array[6];
                                     material[3] = (array[6]+1)*(array[4]+1);
                                     material[4] = array[4];
                                     material[5] = array[4] *2;
                                     material[6] = (array[6]/5)*array[4];
    								 material[7] = (array[6]+1)*2;
                                     printf("\t\t\tMaterialliste\n");
                                     printf("\n\n50er Rahmen\t 0\tEndschutz\t %d\tUnterlagen\t %d\n1.0m Rahmen\t 0\tRingschrauben\t 0\tF\x81sse\t\t %d\n", material[5], material[1], material[1]);
                                     printf("1.5m Rahmen\t 0\tKupplungen\t 0\tEndpfosten\t 0\n2.0m Rahmen\t %d\tAnker\t\t 0\t70er F\x81sse\t 0\n", material[3]);
                                     printf("Traufenrahmen\t 0\tLeitern\t\t %d\t60er Konsole\t 0\n\n", material[4]);
                                     printf("\t      4m\t3m\t2.5m\t2m\t1.5m\t1m\n\n");
                                     printf("Bohlen        0\t\t%d\t0\t0\t0\t0\n",material[0]);
                                     printf("Lehnen        0\t\t%d\t0\t0\t0\t0\n",material[2]);
                                     printf("Diagonalen    0\t\t%d\t0\t0\t0\t0\n",material[6]);
                                     printf("Durchstiege   0\t\t%d\t0\t0\t0\t0\n",material[4]);
                                     printf("\n\t      6m\t5m\t4m\t3m\t2m\t1m\to.5m\n\n");
                                     printf("H.Bohlen      0\t\t0\t0\t0\t0\t0\t0\n");
                                     printf("Rohre         0\t\t0\t0\t0\t0\t0\t0\n");
                                     freopen(dateinamentext,"a+",stdout);  /* dieselbe vorherige ausgabe nur wird sie in das dokument geschrieben*/
                                     printf("%d Felder\n",array[6]);
                                     material = malloc(8 * sizeof(int));
    	                             material[0] = ((array[6]*array[4])*2)-(array[4]*2);
                                     material[1] = (array[6]+1)*2;
                                     material[2] = (array[6]*2*array[4])+array[6];
                                     material[3] = (array[6]+1)*(array[4]+1);
                                     material[4] = array[4];
                                     material[5] = array[4] *2;
                                     material[6] = (array[6]/5)*array[4];
    								 material[7] = (array[6]+1)*2;
                                     printf("\t\t\tMaterialliste\n");
                                     printf("\n\n50er Rahmen\t 0\tEndschutz\t %d\tUnterlagen\t %d\n1.0m Rahmen\t 0\tRingschrauben\t 0\tF\x81sse\t\t %d\n", material[5], material[1], material[1]);
                                     printf("1.5m Rahmen\t 0\tKupplungen\t 0\tEndpfosten\t 0\n2.0m Rahmen\t %d\tAnker\t\t 0\t70er F\x81sse\t 0\n", material[3]);
                                     printf("Traufenrahmen\t 0\tLeitern\t\t %d\t60er Konsole\t 0\n\n", material[4]);
                                     printf("\t      4m\t3m\t2.5m\t2m\t1.5m\t1m\n\n");
                                     printf("Bohlen        0\t\t%d\t0\t0\t0\t0\n",material[0]);
                                     printf("Lehnen        0\t\t%d\t0\t0\t0\t0\n",material[2]);
                                     printf("Diagonalen    0\t\t%d\t0\t0\t0\t0\n",material[6]);
                                     printf("Durchstiege   0\t\t%d\t0\t0\t0\t0\n",material[4]);
                                     printf("\n\t      6m\t5m\t4m\t3m\t2m\t1m\to.5m\n\n");
                                     printf("H.Bohlen      0\t\t0\t0\t0\t0\t0\t0\n");
                                     printf("Rohre         0\t\t0\t0\t0\t0\t0\t0\n");
                                }
    
    						  else{
    						     printf("Falsche Eingabe!!!\n");
    							 return EXIT_FAILURE;
    							 }
                        }
                    }
    			}
    		}
    	}
    


  • negaduck schrieb:

    Es tut mir echt leid das ich euch hier mit fragen löcher.

    Irgendwie kann ich in deinem Posting keine Frage finden.
    Was sollen die ganzen mallocs? 😕

    http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/format.html
    http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/c_zahlenformatierung_de

    Du kannst ja mal gucken, was du so unter "printf formatierte ausgabe" im Internet findest.



  • ohh sorry ich idiot!!!
    Die Funktion freopen() speichert mir die ausgaben extra in einer datei aber dafür muss ich danach alles nochma komplett angeben und das macht den code so unglaublich lang.meine frage ist welche funktion man dafür eher verwenden sollte damit die ausgaben auch in der entsprechenden datei gespeichert wird.

    die mallocs in zeile 10 und 65 wären überflüssig gewesen da hab ich nicht aufgepasst.danke



  • Bei einem Array fängt der Index immer bei 0 (Null) an (zumindest in C). D.h wenn das Array 7 Elemente hat, dann werden diese von 0 bis 6 bezeichnet. Das Element mit dem Index 7 existiert nicht.

    Das gilt auch, wenn du den Speicher per malloc besorgst.*

    Weißt du auch was if(array[1] % 300) bedeutet und macht?

    *Warum eigentlich? Ist doch gar nicht nötig.



  • Du machst die Ausgabe mit fprintf in einer eigenen Funktion.
    Dieser Funktion übergibst du u.a. auch den Dateihandle.
    Du rufst die Funktion einmal mit datei und einmal mit stdout auf.


Log in to reply