Zamiana kropek na przecinki w pliku tekstowym

0

Mam plik tekstowy postaci

0.00
0.72
1.44
2.16
2.88
3.60
4.32

i tak dalej;
Teraz potrzebuję zamienić kropki na przecinki. Plan mam taki:

  • otwórz plik i ustaw wskaźnik na początku pliku
  • sprawdź, czy znak to kropka - jeśli tak, to zamień na przecinek, jeśli nie, to przejdź dalej
  • i tak do końca pliku

Na początku chciałem sobie zobaczyć, w jaki sposób zrobić samo przeszukiwanie pliku znak po znaku.

FILE *fp;
if ((fp=fopen(sciezka, "r+"))==NULL)
    {
        printf ("Nie moge otworzyc pliku %s!\n", sciezka);
        exit(1);
    }
for(i=0;i<30;i++)
   {
       fseek(fp, i, SEEK_SET);
        if(getc(fp)==".")
            printf("\nbingo!");
        else
            printf("\npudlo");
   }

Jak łatwo się domyślić to nie działa i teraz zastanawiam się czemu. Jak rozumiem fseek porusza się po bajtach, nie po znakach. Więc w jaki sposób ustawić wskaźnik na "."?

2
int c;
while((c = getc(fp)) != EOF)
1

to co robisz źle to to, że czytasz 30 znaków czy tam linii nie znam c. a co jeśli jest mniej linii/znaków w pliku? program scrashuje. Musisz czytać plik od początku do końca a nie ustaloną wcześniej ilość linii chyba, że twój plik z założenia ma 30+ linijek

1
#include <stdio.h>

int main(void) {
	int c;
	while((c = getc(stdin)) != EOF)
		putc(c=='.'? ',' : c, stdout);
	return 0;
}
In Out
0.00
0.72
1.44
2.16
2.88
3.60
4.32

|

0,00
0,72
1,44
2,16
2,88
3,60
4,32

dodanie znaczników <code class="c"> - @furious programming

0

Dzięki, rzeczywiście dla parametru stdout działa wszystko fajnie, lecz w jaki sposób teraz to zapisać do pliku? Tj. mam FILE *katy i ścieżkę do pliku zapisaną w plik_z_katami

    if ((katy=fopen(plik_z_katami, "w"))==NULL)
    {
        printf ("Nie moge utworzyc pliku katy.txt!\n");
        exit(1);
    }
    for(i=0;i<501;i++)
        fprintf(katy, "%.2f\n", kat[i]);                 // zapisuje katy do pliku
    int c;
    while((c = getc(katy)) != EOF)
    {
        putc(c=='.'? ',' : c, katy);
    }
    fclose(katy);

I jak w putc dam stdout to wszystko śmiga, ale jak zapisać te zmiany w tym samym pliku?

`dodanie znaczników ``` - @furious programming

1

Dorzuć przed putc to:

fseek(file, -1, SEEK_CUR);

<font color="red">Być może po putc będziesz musiał wrzucić to:

fseek(file, 0, SEEK_CUR);
</span> <font color="yellow">Niestety jestem w tym momencie zbyt leniwy, żeby to sprawdzić</span>
0
    while((c = getc(katy)) != EOF)
    {
        fseek(katy, -1, SEEK_CUR );
        putc(c=='.'? ',' : c, katy);
    }

Na końcu pliku zaczęło dopisywać

,.,.,.

http://prntscr.com/712lym

0

Hmm, zmieniłem teraz kod na

if ((katy=fopen(plik_z_katami, "w"))==NULL)
    {
        printf ("Nie moge utworzyc pliku katy.txt!\n");
        exit(1);
    }
    for(i=0;i<501;i++)
        fprintf(katy, "%.2f\n", kat[i]);                 // zapisuje katy do pliku
    fclose(katy);
    int c;
    if ((katy=fopen(plik_z_katami, "r+"))==NULL)
    {
        printf ("Nie moge utworzyc pliku katy.txt!\n");
        exit(1);
    }
   while((c = getc(katy)) != EOF)
    {
        fseek(katy, -1, SEEK_CUR);
        putc(c=='.'? ',' : c, katy);
        fseek(katy, 0, SEEK_CUR);
    }
    fclose(katy);

i wypluwa taki plik

0,00
,72
,44
,16
,88
,60
,32
,04
,76
,48
,20
,92
,64
,36
0,08
0,80

a powinno być tak (oczywiście z przecinkami):

0.00
0.72
1.44
2.16
2.88
3.60
4.32
5.04
5.76
6.48
7.20
7.92
8.64
9.36
10.08
10.80

edit: już doszedłem, powinno być

    while((c = getc(katy)) != EOF)
    {
        fseek(katy, -1, SEEK_CUR);
        if(getc(katy)=='.')
        {
            fseek(katy, -1, SEEK_CUR);
            putc(',', katy);
        }
        fseek(katy, 0, SEEK_CUR);
    }

Dzięki za pomoc

dodanie znaczników <code class="c"> - @furious programming

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