Frage zum Zeilenvorschub



  • Ich grüße euch,

    soweit ich weiß besteht ein \n aus 2 char variablen.

    Die folgende Funktion liest Zeile für Zeile ein Array (die ganze Zeile) aus einer Textdatei aus, danach werden die Zeichen dieses Arrays umgedreht und wieder in eine andere Textdatei geschrieben.

    __________________________________________________________________

    #include <stdio.h>
    #include <string.h>
    void dreh(char *x);

    int main(void)
    {
    FILE *fp1, *fp2;
    char quelle[40], ziel[40], a[303];
    printf("Quelldatei = ? ");
    scanf("%s",quelle);
    printf("Zieldatei = ? ");
    scanf("%s",ziel);

    fp1 = fopen(quelle,"r");
    fp2 = fopen(ziel,"w");

    if(fp1==NULL)
    {
    printf("Datei nicht gefunden\n");
    return(-1);
    }
    if(fp2==NULL)
    {
    printf("Fehler!\n");
    return(-1);
    }

    fgets(a,303,fp1);

    while(!feof(fp1))
    {
    dreh(a);
    fputs(a,fp2);
    fgets(a,303,fp1);
    }

    fclose(fp1);
    fclose(fp2);

    return(0);
    }

    void dreh(char *x) /* dreht den eingelesenen String um */
    {
    char p, wert;
    p=x+strlen(x)-2; /
    <----- Problem, ich schrieb hier statt -2, -3 */
    while(x<p)
    {
    wert = *x;
    *x = *p;
    *p = wert;
    x++;
    p--;
    }
    }

    __________________________________________________

    Weshalb kommt dort ein -2 hin. Wir stehn doch nach der Addition auf dem \0 Zeichen. Dh. es müsste -1 (letztes array des \n), -2 (ertes array des \n), -3 (letztes textzeichen) sein.

    Kann mir jemand weiterhelfen, vielen dank ! :))

    MfG
    WaL



  • \n ist ein Zeichen, nicht zwei.



  • Joa so wär die logische folge. Aber in meinem C Buch steht das es aus 2 Char Variablen besteht und zwar aus CR und LF (2 Bytes).



  • BLauWal schrieb:

    Joa so wär die logische folge. Aber in meinem C Buch steht das es aus 2 Char Variablen besteht und zwar aus CR und LF (2 Bytes).

    Das Buch ist unvollständig. Unter Windows sind es CR und LF, während es unter Linux/Unix nur LF ist. Bei Apple ist es afaik nur CR.



  • '\n' macht new line mit cr + lf, jedoch ist es ein zeichen



  • hinter strlen() steht -2 anstelle von -1, weil nicht nur das NUL-byte sondern auch das newline übersprungen werden muß! anderenfalls würde bei der umgedrehten textzeile das newline ja am zeilenanfang stehen.

    im prinzip besteht das newline unter dos/windows aus zwei zeichen: CR+LF. allerdings wandeln das die ansi-c-dateifunktionen beim einlesen in ein einzelnes LF um, und beim schreiben wieder zurück nach CR+LF. das schreiben von portablen programmen würde sonst reichlich erschwert.

    man kann diese automatische umwandlung auch mit dem flag "b" (für binary) abschalten. etwa fopen(quelle,"rb").



  • Vorden schrieb:

    '\n' macht new line mit cr + lf, jedoch ist es ein zeichen

    jo, das hängt davon ab wie es von irgendwelchen ausgaberoutinen usw. interpretiert wird. will ich eine zeile mit vorschub unter win auffe console ausgeben reicht printf ("lala\n"); sende ich die aber an ein serielles terminal muss ich schreiben: printf ("lala\r\n");



  • [quote="Konfusius"]hinter strlen() steht -2 anstelle von -1, weil nicht nur das NUL-byte sondern auch das newline übersprungen werden muß! anderenfalls würde bei der umgedrehten textzeile das newline ja am zeilenanfang stehen.
    [quote]

    Die Frage war ja auch nach -2 oder -3 =). Ich hatte eine Wissenslücke, verschnallt bin ich durch diese Schwäche allerdings noch lange nicht :P.

    [quote="Konfusius"]im prinzip besteht das newline unter dos/windows aus zwei zeichen: CR+LF. allerdings wandeln das die ansi-c-dateifunktionen beim einlesen in ein einzelnes LF um, und beim schreiben wieder zurück nach CR+LF. das schreiben von portablen programmen würde sonst reichlich erschwert.

    man kann diese automatische umwandlung auch mit dem flag "b" (für binary) abschalten. etwa fopen(quelle,"rb").[quote]

    Danke, endlich mal jemand der sich auskennt! 🙂

    Wenn ich eine Datei im Textmodus öffne und beschreibe macht er aus dem \n 2 Zeichen, bei der rückwandlung (Textmodus) macht er aus dem \n wieder ein Zeichen.

    Wenn ich diese Textdatei (im Textmodus beschrieben) binär öffne würde er 2 Zeichen für das \n einlesen, da es die Bytes wie sie in der Datei stehn direkt in den Puffer lädt.

    Wenn ich Binär schreibe und Binär lesen würde gäb es keine Umwandlung und und \n = 1Zeichen, in der Datei wie auch im Puffer. Die logischste Methode! 🙂 Allderings kann man soweit ich weiß per Hand keine Textdatei öffnen und sie "Binär" beschreiben. Also ungeeignet für mein obenstehendes Programm.

    Danke für eure Hilfe!

    MfG


Anmelden zum Antworten