Operacje na plikach

2015-03-10 12:45

Rejestracja: 5 lat temu

Ostatnio: 4 lata temu

0

Witajcie, mam problem. Muszę pobrać od użytkownika nazwę plików w jakich będę później w programie pracował, ale zawsze program wchodzi w pętle i ani rusz dalej. Nie wiem co jest grane. Powiem dodatkowo, że na dobrą sprawę nie wiem jak napis wczytać od użytkownika, nie wiem czy to fgets() jest tutaj dobrze użyte.

#define ZNK 19

int main()
{
    para tab[ROZ];
    FILE *we,*wy;
    char dane[ZNK], wyjscie[ZNK];

    printf("podaj nazwe pliku z danymi (max 15 znakow)");
    fgets(dane,ZNK,stdin);
    //strcat(dane,".txt");
    printf("\npodaj nazwe pliku wyjscia (max 15 znakow)");
    fgets(wyjscie,ZNK,stdin);
    strcat(wyjscie,".txt");

    if((we=fopen(dane,"r"))==NULL)
    {
        fprintf(stdin,"Nie moge otworzyc pliku z danymi");
        exit(1);
    }
    if((wy=fopen(wyjscie,"a+"))==NULL)
    {
        fprintf(stdin,"Nie moge otworzyc pliku wyjscia");
        exit(2);
    }
    return 0;
}

Od razu mówię, że mam przygotowany plik .txt z którego chciałem skorzystać ;p

edytowany 1x, ostatnio: Neeus, 2015-03-10 12:49

Pozostało 580 znaków

2015-03-10 13:13

Rejestracja: 5 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Łódź

1

1) ponieważ przy printfie nie masz końca linii, to nie zobaczysz napisów przed fgets-em
2) fgets wczyta ci też znak końca linii
3) ograniczasz string wczytywany przez fgets do ZNK znaków a pozniej dodajesz kolejne 4, czyli kolejne miejsce potencjalnych problemów
4) fprintf jak już to do stdout
5) nie zamykasz otwartych plików

to tyle na szybko - jak poprawisz to wszystko zauważone na prędce i dalej nie będzie działać, to przyjrzę się dokładniej


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie

Pozostało 580 znaków

2015-03-10 13:36

Rejestracja: 5 lat temu

Ostatnio: 4 lata temu

0
kaczus napisał(a):

2) fgets wczyta ci też znak końca linii

to w takim razie czego użyć?

3) ograniczasz string wczytywany przez fgets do ZNK znaków a pozniej dodajesz kolejne 4, czyli kolejne miejsce potencjalnych problemów

chodzi Ci o to, że plik, który podaję ma być równy ZNK?

5) nie zamykasz otwartych plików

bo nawet ich jeszcze nie wczytałem :/

poprawienie znaczników <quote> - @furious programming

edytowany 1x, ostatnio: furious programming, 2015-03-10 13:46
Cytuj posty tak, jak cytować się powinno; Poza tym jeśli dodajesz coś do czyichś słów, to to nie jest już cytat; - furious programming 2015-03-10 13:47

Pozostało 580 znaków

2015-03-10 13:40

Rejestracja: 5 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Łódź

1

ad 2. można fgetsa - jednak pamiętając, że trzeba go przyciąć o znak końca linii
ad 3. podajesz, że chcesz wczytać maksymalnie ZNK znaków i jeśli ktoś tyle poda, albo niedużo mniej, to strcat późniejszy zamaże nie swoją pamięć.
ad 5. jeśli dojdziesz do drugiego warunku, to jeden plik już jest otwarty.


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie

Pozostało 580 znaków

2015-03-10 13:54

Rejestracja: 5 lat temu

Ostatnio: 4 lata temu

0
kaczus napisał(a):

ad 2. można fgetsa - jednak pamiętając, że trzeba go przyciąć o znak końca linii

No tak, tylko jak? :/ Jest jakaś funkcja która ostatni znak usuwa?

Mam ogólny pomysł, żeby strlen(dane) zapisać do zmiennej int liczba i po prostu dla dane[liczba] zapisać, żeby usunąć plik, ale nie wiem co wpisać, jak wyczyścić komórkę?

Dobra, mam. :P Trochę w prowizoryczny sposób ale mam.

int liczba=0;

    printf("podaj nazwe pliku z danymi (max 15 znakow)\n");
    fgets(dane,ZNK,stdin);
    liczba=strlen(dane);
    dane[liczba]='Ě';
    //strcat(dane,".txt");
    printf("\npodaj nazwe pliku wyjscia (max 15 znakow)\n");
    fgets(wyjscie,ZNK,stdin);
    liczba=strlen(wyjscie);
    wyjscie[liczba]='Ě';
kaczus napisał(a):

ad 3. podajesz, że chcesz wczytać maksymalnie ZNK znaków i jeśli ktoś tyle poda, albo niedużo mniej, to strcat późniejszy zamaże nie swoją pamięć.

Ale napisałem w printfie, że max 15 znaków, a w define jest 19, jeżeli o to chodzi.

edytowany 2x, ostatnio: Neeus, 2015-03-10 14:05

Pozostało 580 znaków

2015-03-10 14:01

Rejestracja: 5 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Łódź

ad 2. na przykład tak:

if (dane[strlen(dane) - 1] == '\n')
  dane[strlen(dane) - 1]  = 0;

ad 3. czyli maksymalnie można podać 14 znaków, a nie 15 - bo tak na prawdę możesz mieć 18 znaków (jeden jest potrzebny na znak końca ciągu znaków), ale wtedy również powinieneś w fgetsie to ograniczenie wstawić (czyli 15 - wtedy fgets przypilnuje, by było maksymalnie 14 znaków)


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie

Pozostało 580 znaków

2015-03-10 14:11

Rejestracja: 5 lat temu

Ostatnio: 4 lata temu

0

Dobra, dzięki wielkie, pierwszy etap mojej katorgi za mną :D

Pozostało 580 znaków

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