Różnica między wielkością txt a długością odczytanego pliku

0

Program, który odczytuje zawartość pliku txt i zapisuje ją do zmiennej char*.

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

long getFileSize(char *filename)
{
    FILE *file = fopen(filename,"r");
    long tmp;
    fseek(file,0,SEEK_END);
    tmp = ftell(file);
    fclose(file);
    return tmp;
}

char *getFileContent(char *filename)
{
    FILE *file;
    long filesize = getFileSize(filename);
    char *buffer = malloc(filesize+1);
    if (file = fopen(filename, "rt"))
    {
        fread(buffer, 1, filesize, file);
        buffer[filesize] = 0;
        fclose(file);
    }
    return buffer;
}

int main()
{
    char *content = getFileContent("shows.txt");
    printf("%Rozmiar pliku: %d\nDlugosc content: %d\n",getFileSize("shows.txt"),strlen(content));
    int index;
    int buff=0;
    for(index=0; index<strlen(content); index++)
        if(content[index]=='\n')
            buff++;
    printf("Liczba znakow \\n: %d\n",buff);
    return 0;
}

Odczytywany plik w załączniku.

No i problem. Program wypisuje:

Rozmiar pliku: 74205
Dlugosc content: 73728
Liczba znakow \n: 1216

  1. Dlaczego rozmiar pliku i długość zmiennej jest różna?

  2. Dlaczego nie zgadza się liczba znaków nowej linii? shows.txt otwarty w Notepad++ pokazuje, że ma 1204 linie (licząc od 1), a z powyższego wynika, że ma 1216 linii.

  3. Gdy próbowałem wyświetlić zawartość zmiennej content program wyświetlił całą zawartość pliku plus śmieci będące wyciętym mniej więcej środkiem tego pliku.

Zakładam temat, bo trochę nad tym siedziałem. I poległem.

Ps. Plik shows.txt jest wynikiem obróbki stron HTML pobranych przez cURL-a z filmwebu. Nie wiem czy ma to jakieś znaczenie, ale piszę...

1

Musisz otwierać binarnie.

0

"rt" zamieniłem na "rb" i działa. Dzięki :)

0

By nie otwierać nowego tematu zapytam tutaj jeszcze...

W pliku polskie znaczki wyglądają ok, ale już po wyświetleniu w konsoli w ich miejscu pojawiają się śmieci.

W jaki sposób przerobić tak zapisany plik z UTF-8 (w takim kodowaniu jest cały filmweb) na ASCII zamieniając ł na l, ą na a itd?

Wiem, że wchar mógłby załatwić sprawę, ale teraz i w języku C nie chcę się tym zajmować. Chcę tylko pozbyć się problemu a nie go rozwiązać.

Ew. czy można utworzyć plik PIF uruchamiający program w taki sposób, by otworzył konsolę pozwalającą na wyświetlanie tych znaków? Standardowa Windowsowa korzysta chyba z CP-1250, a nie znalazłem opcji przy tworzeniu PIF-a by to zmienić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1