c - Problem med at fjerne nye linjer & printf

Indlæg af Hanne Mølgaard Plasc

Problem



En txt-fil læses i binær tilstand og gemmes i en buffer (jeg skriver en HEX-editor, så det er vigtigt, at filer læses i binær tilstand):


originalfil [13]


Følgende kode fjerner eventuelle nye linjer og udskriver txt til konsollen:


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

FILE *fileptr;
unsigned char *buffer;
long filelen;

int main(int argc, char* argv[]){

    fileptr = fopen(argv[1], "rb");
    fseek(fileptr, 0, SEEK\_END);
    filelen = ftell(fileptr);
    rewind(fileptr);

    buffer = (char *)malloc((filelen+1)*sizeof(char));
    fread(buffer, filelen, 1, fileptr);
    fclose(fileptr); // Close the file

    for (int i = 0; i < filelen; i++){
        if (buffer[i] == '
'){
            printf(".");
        }else{
            printf("\%c", buffer[i]);
        }
    }
}


Dette er tilsigtet output, , hvad vi vil :
forventet output [14]


Dette er faktiske output, ikke hvad vi vil :
ukorrekt/faktisk output [15]


Når en sleep(); kommando er tilføjet, er det, hvad der synes at forekomme ( Anden linje fremhævet i grønt for klarhed ):


Indtast billedbeskrivelse her [16]


Den første linje udskrives fint, da den nye linje er nået, det er her fejlen opstår, den nye linje synes at blive fjernet, kun markøren hopper tilbage til begyndelsen af ​​linjen , denne adfærd er ikke forventet eller er det ønsket.

Bedste reference


Prøv dette


for (int i = 0; i < len; a++){
    if ((buffer[i] == 10) || (buffer[i]==13)){
        printf(".");
    }else{
        printf("\%c", buffer[a]);
    }
    fflush(stdout);
}


som du ved unix, dos og mac .txt filer har forskellige måder at angive starten på en ny linje, og det kan forårsage et problem for dig. I den reviderede kode i stedet for at søge programmet ser efter ascii koder 10 og 13 - linjeskift og vognretur. Den uønskede konsekvens er, at du får to . s mellem linjer til ms-dos type filer, men du kunne ændre rundt, der gav dig vidste du ville kun nogensinde have ms-dos type .txt filer


Den anden ting, jeg har tilføjet, er muligvis ikke nødvendig, er fordi fflush(stdout);, fordi tingene ofte ikke vises umiddelbart på skærmen, da det ofte tvinges til at tvinge ting, der skal udskrives. Det kan ikke være nødvendigt.


Jeg tror, ​​at årsagen til, at du får en linje skrevet oven på den anden, er fordi du har en dosetype .txt -fil med en vognretur og et linefeed-tegn i slutningen af ​​hver linje - du fanger linjeposten med din if erklæring, men ikke vognreturet, som sender markøren til begyndelsen af ​​linjen og betyder, at den første del af tekstfilen overskrives af anden del.