fopen() und datei namensgebung



  • 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.



  • Du kannst für die Anzeige in der Konsole und für die Ausgabe in eine Datei die Funktion fprintf benutzen.
    Dafür kannst du dir eine Funktion schreiben, die beides erledigen kann.
    An die Funktion brauchst du nur noch den entsprechenden Zeiger vom Typ FILE* als Parameter zu übergeben(stdout für die Konsolenanzeige, einen gültigen, vom fopen zurückgegebenen Zeiger fürs Schreiben in eine Datei).



  • ja ich weiss was der modulo operator macht,ich hab ja gesagt das es nur ein ausschnitt ist und es gibt noch den fall wo kein rest entsteht.
    zu den arrays und dem indizeirungsoperator.ich hab 8 werte für material reseviert und bin von o-7 drauf eingegangen und beim array hab ich 7 elemente reserviert und bin von 0-6 drauf eingegangen.

    ok danke ich schaue mir fprintf mal genauer an.


Anmelden zum Antworten