fputc



  • Hallo Leute

    Eine Frage. Ist es möglich die erzeugte Textdatei auch im Ansi-Format zu bekommen?

    Ich hab folgenden Code

    char fTxt[]="file.txt"
    errno_t e;
    FILE *f=stdout;
    e=fopen_s(&f,fTxt,"wb");
    
    Hier sind die Werte drin
    unsigned int arr[200];
    
    for(int i=0;i<len;i++){	
    	fputc(arr[i],f);
    }
    

    Alles funktioniert wunderbar, bis auf die txt-Datei die erzeugt wird.

    Wenn ich 'file.txt' öffne ist alles im Unicode-Format. Lässt sich das eventuell auf diesem Wege beeinflussen. Ich möchte das lesbar haben.

    Danke für die Antwort.

    wachs



  • Da paßt einiges logisch nicht zusammen.
    Welche Werte stehen in deinem Array und wie soll die Textdatei aussehen?



  • Hallo Th69

    Ich habs herausgefunden, in der arr können auch Werte drin sein, die aus der Berechnung 0 ergeben. die müsste der Wert 48 rein.

    Was passt den deiner Meinung nach 'einiges logisch' nicht zusammen?

    gruss wachs


  • Mod

    wachs schrieb:

    Was passt den deiner Meinung nach 'einiges logisch' nicht zusammen?

    ints, chars, Unicode.



  • Du öffnest die Datei im Binärmodus und schreibst auch Binärdaten hinein, schreibst aber, daß du eine Textdatei erzeugen willst (d.h. soweit ich verstehe die Zahlen dann auch in Textdarstellung ("lesbar") haben möchtest).
    Lesbare Zahlen erzeugst du mit

    fprintf(f, "%s\n", arr[i]);
    


  • Danke für's Feedbacks.

    Die uint-Array habe ich bewusst so gemacht, da sich mit der einfach besser rechnen lässt. Die Werte sind sowieso nie höher als 200.

    Die txt-Datei wurde mir anfänglich im Unicodeformat erstelle mit asiatischen Werten, dass hat sich mittlerweile mit der Korrektur des Wertes 0 (ist nur eine Substitution, ich könnte da genau so gut auch ein Leerzeichen oder Umbruch einsetzen) erledigt. Es ging mir nur um die Lesbarkeit (als Buchstabe oder als Text) der Werte, die in die Datei abgelegt werden.

    Das Einlesen von der Datei wieder in eine uint-Array funktioniert auch. Die Subsitutionswerte die muss ich natürlich dann wieder anpassen. Ansonsten alles IO.

    Von meiner Seite hat sich's erledigt.

    Werde mich wieder melden, sofern es noch ein weiteres Problem ergibt. Danke.

    wachs



  • Irgendwo in deiner Logik bist du falsch abgebogen.

    Es kann sein, dass sich zwei Fehler aufheben, dann ist es aber immer noch zweimal falsch.



  • Ich denke nicht. Denn dieser Code erstellt mir eine txt-Datei im Uniocdeformat.
    Wenn man Bilder uploaden könnte, wäre es sofort ersichtlich.

    #include "stdafx.h"
    typedef unsigned int uint;
    
    int _tmain(int argc, _TCHAR* argv[]){
    
    	char fTxt[]="file.txt";
    	uint arr[10]={118,111,55,69,78,112,0,178,33,100};
    	int len=sizeof(arr)/sizeof(uint);
    
    	errno_t e; 
    	FILE *f=stdout; 
    	e=fopen_s(&f,fTxt,"wb");
    
    	for(int i=0;i<len;i++){ 
    		fputc(arr[i],f); 
    	}
    	if(f!=stdin)
    		fclose(f);
    
    	return 0;
    }
    

    Output

    潶䔷灎눀搡
    

    Ersetze ich das 0 in 'arr' mit der zahl '13' so wird wir eine txt-Datei im Ansiformat erstellt.

    Output

    vo7ENp
    ²!d
    

    wachs



  • Keine Ahnung, was Du mit Unicode und ANSI meinst. Jedenfalls nicht das, was der Rest der Welt dadrunter versteht.



  • mmmhhhhh. Bei mir kann man Text-Dateien (notepad.exe) in 4 verschiedenen Formaten speichern.

    - ANSI
    - Unicode
    - Unicode Big Endian
    - UTF8

    wachs



  • Das ist deine Fehlinterpretation der Darstellung von Notepad++.

    '\0' (oder 0) kommt normalerweise in Textdateien nicht vor, darum wird sie wohl als Unicode oder Binärdatei angesehen.
    Das hat aber nichts mit dem "b" im Mode von fopen zu tun.



  • Du meinst es ist besser so?

    e=fopen_s(&f,fTxt,"w");
    

    Kommt bei mir genau das gleiche heraus.

    Also wenn es eine Möglichkeit gäbe, das Format der Text-Datei gezielt zu ändern, wäre mir natürlich noch besser geholfen. Ist das überhaupt möglich mit 'fopen'?



  • wachs schrieb:

    Du meinst es ist besser so?

    e=fopen_s(&f,fTxt,"w");
    

    Kommt bei mir genau das gleiche heraus.

    Nein, das meinte ich nicht.

    Es kommt etwas anderes raus, wenn du eine 10 (bei Windows und Mac-OS) in deinen Daten hast.
    Aber das wirst du nicht feststellen, weil du es nicht siehst.

    wachs schrieb:

    Also wenn es eine Möglichkeit gäbe, das Format der Text-Datei gezielt zu ändern, wäre mir natürlich noch besser geholfen. Ist das überhaupt möglich mit 'fopen'?

    Was hast du genau vor?

    Was soll deiner Meinung nach in Notepad zu sehen sein.



  • Das mit den unterschiedlichen Umbrüchen in Mac und Windows weiss ich.

    Es geht mir nur um die Möglichkeit die errechneten Werte in der 'arr' in eine Datei zu legen, um bei Gebrauch wieder in eine neue 'arr' zu füllen.

    Das war's.

    Ok. Das mit der komischen Codierung in' Unicode das hat mich schon verwirrt. Darum auch meine Frage hier. Aber zwischenzeitlich hab ich das komplett gelöst und es funktioniert.

    gruss wachs



  • wachs schrieb:

    Es geht mir nur um die Möglichkeit die errechneten Werte in der 'arr' in eine Datei zu legen, um bei Gebrauch wieder in eine neue 'arr' zu füllen.

    Das war's.

    Dann schreib sie entweder menschenlesbar mit fprintf oder direkt binär.
    Aber dann ist fputc (so wie du es machst) der falsche Weg.

    Zu fprintf gehört dann fscanf zum Einlesen. Damit bist du ziemlich universell unterwegs.
    Bei der binären Variante arbeitest du dann mit fwrite und [c]fread . Das ist dann aber Systemgebunden.

    wachs schrieb:

    Ok. Das mit der komischen Codierung in' Unicode das hat mich schon verwirrt. Darum auch meine Frage hier. Aber zwischenzeitlich hab ich das komplett gelöst und es funktioniert.

    Gerade das "es funktioniert aber bei mir" ist in C kein Garant dafür, dass es immer funktioniert.



  • Ich werde mir die von dir erwähnten Möglichkeiten durcharbeiten. Dank.

    wachs



  • Also stellt bei dir das Array keine Sammlung von Zahlen dar, sondern Encoding-Werte (ASCII, Unicode, o.ä).

    Warum nimmst du dann nicht gleich ein normales Char-Array?

    char arr[] = "vo7ENp\n²!d";
    

    PS: Unicode- und UTF8-Dateien haben meistens zur Unterscheidung einen Byte Order Mark (BOM)-Wert am Anfang.



  • wäre auch möglich, aber ich lass es jetzt mit der uint. und was die Speicherung in die Datei mittels fputc anbelangt, habe ich auch eine Lösung gefunden.

    nochmals danke

    wachs


Anmelden zum Antworten