Operacje na plikach

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

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

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

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.

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.

1

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)

0

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

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