• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jezyk C-kopiowanie z pliku do pliku_bład

Object Storage Arubacloud
0 głosów
415 wizyt
pytanie zadane 22 kwietnia 2020 w C i C++ przez reken Początkujący (390 p.)

Witam
Mam do wykonania zadania polegajace na kopiowaniu danych z pliku do pliku.Pierwsza czesc polegajaca na skopiowaniu wg kolejnosci została zrobiona natomiast inna czesc zadania polegajaca na pobraniu znakow w odwrotnej kolejnosci juz nie tak gladko.Tj z pliku z ktorego pobieram-pobieram od konca a zapisuje pliki od poczatku.Kilka zalozen do programu:

W programie można zadeklarować tylko tablice na 30 znaków (do przechowywania nazw plików). Deklaracja musi wyglądać następująco: nazwa_zmiennej[31]

Sciezki maja zostac pobrane od uzytkownika.Gdy nie otworze pliku komunikat Couldn't open file i niezwłocznie zakończyć działanie z kodem błędu 4 Gdy nie uda się utworzyć pliku docelowego, program powinien wyświetlić komunikat Couldn't create file i niezwłocznie zakończyć działanie z kodem błędu 5.W przypadku sukcesu program program powinien wyświetlić komunikat File copied i zwrócić wartość 0.

 

Program przechodzi wstepne testy nastepnie .Zostaja generowane pliki  do odczytu przy kazdym tescie i jest sprawdzany odczyt zapis
I przy okolo 6 probie:

Podaj sciezke do pliku:poundlessturnputpointstudybelieve⏎
Podaj sciezke do pliku wyjsciowegp:File copiedfollow.txt⏎

Program zakończony; kod błędu=0 (Ok)

Test został przerwany; Błąd wczytywania pliku follow.txt

zawartosc pliku poundlessturnputpointstudybelieve:

Magnam etincidunt amet velit quiquia eius quaerat numquam. Aliquam adipisci consectetur modi. Sit dolorem sed magnam. Quaerat eius dolore ipsum sed quiquia dolor amet. Magnam velit dolor dolorem aliquam voluptatem quiquia. Quisquam sit dolore quaerat est modi. Est est aliquam magnam. Sit ut adipisci sed etincidunt dolore dolorem neque. Voluptatem consectetur voluptatem quaerat neque numquam amet etincidunt. Non tempora ut velit.
Dolor non amet labore etincidunt numquam ipsum. Numquam quaerat tempora dolor non voluptatem voluptatem. Magnam sed ut ipsum dolore dolore consectetur. Quaerat porro quaerat sit magnam velit sit. Neque neque neque tempora labore porro. Eius sed quisquam neque labore. Tempora adipisci ipsum numquam est sit neque. Quisquam tempora adipisci numquam neque. Velit quaerat numquam etincidunt porro quiquia. Dolorem consectetur labore amet amet adipisci numquam quaerat.
Non modi numquam numquam sed neque etincidunt. Ipsum est modi non etincidunt modi. Modi est ipsum amet neque eius. Modi quiquia labore quisquam ipsum. Sit consectetur dolore consectetur. Neque non porro dolorem sed sed dolorem voluptatem. Voluptatem porro dolore quisquam.
Labore porro est dolore non quisquam est. Dolorem quaerat modi amet sed sed. Modi numquam dolorem magnam porro. Sed sit etincidunt magnam adipisci. Ut dolore velit amet non.
Magnam eius est amet quiquia aliquam. Voluptatem etincidunt dolore sed dolorem. Magnam quaerat adipisci dolorem. Magnam labore modi quaerat. Sed modi quiquia numquam adipisci velit labore dolorem.
Ipsum quisquam porro est. Non porro adipisci modi neque sed ipsum. Velit est magnam dolor dolore labore. Est tempora ipsum velit quisquam dolorem. Modi est labore eius sed etincidunt porro. Quaerat dolorem quisquam dolore numquam dolor porro dolore. Neque dolor non ipsum quaerat.
Neque est velit labore adipisci magnam porro sit. Ut tempora tempora sit porro tempora tempora magnam. Dolore sed quaerat voluptatem modi tempora eius neque. Quiquia etincidunt magnam voluptatem eius numquam. Voluptatem etincidunt dolore etincidunt etincidunt ut. Voluptatem ut numquam dolorem consectetur. Non sed porro tempora amet amet modi numquam. Neque non voluptatem ut neque. Numquam amet neque neque dolor. Eius eius numquam labore.
Amet dolor modi magnam voluptatem. Dolorem ipsum etincidunt eius dolorem quaerat. Neque non tempora est voluptatem magnam etincidunt amet. Quaerat dolorem porro numquam sed voluptatem non. Tempora consectetur quaerat neque aliquam amet ipsum quisquam. Modi magnam consectetur consectetur. Magnam modi ipsum sed voluptatem amet magnam. Non ut adipisci amet voluptatem eius.
Modi voluptatem dolorem dolor. Ipsum aliquam aliquam numquam tempora dolor. Numquam adipisci non voluptatem ipsum numquam. Numquam amet quaerat sit velit ipsum numquam quiquia. Modi quaerat est quisquam eius magnam dolor tempora. Dolor sit sit amet sit tempora quiquia.
Dolore labore quaerat voluptatem eius dolor dolor amet. Etincidunt sed est velit dolor velit etincidunt non. Magnam ipsum quiquia velit. Dolorem consectetur consectetur tempora quisquam neque eius modi. Dolore quaerat dolor tempora tempora. Labore non dolorem sit. Velit non amet quisquam voluptatem quiquia dolorem. Non quisquam ipsum quisquam ut sit numquam velit. Sed porro neque dolorem quiquia.
Quaerat porro tempora neque. Dolor quisquam dolorem magnam. Sed modi dolor dolorem amet adipisci numquam. Dolorem etincidunt quaerat consectetur. Amet numquam voluptatem amet.
Amet numquam dolorem numquam est tempora adipisci. Amet tempora dolorem quisquam non eius ipsum. Quiquia eius modi quaerat velit labore consectetur. Modi non porro magnam tempora numquam quiquia. Numquam adipisci tempora magnam.
Ipsum aliquam quaerat numquam numquam quaerat aliquam. Non quiquia neque modi velit etincidunt labore. Adipisci labore dolorem dolor. Sed sit numquam quisquam tempora ipsum. Porro voluptatem dolore neque. Amet dolore consectetur non. Non quaerat consectetur est. Quaerat sed dolorem sed neque.
Non dolorem velit magnam. Voluptatem voluptatem neque labore eius est labore. Tempora dolorem quaerat tempora. Quisquam numquam ipsum sed sed dolor. Etincidunt velit dolore neque non modi. Ut quaerat quaerat numquam quaerat porro. Dolore tempora porro est numquam. Quiquia adipisci numquam etincidunt quaerat labore.
Voluptatem labore modi ut neque. Sit ipsum quiquia consectetur labore quiquia aliquam. Modi labore dolore voluptatem eius. Magnam amet quisquam quaerat velit quisquam numquam neque. Porro etincidunt quaerat etincidunt. Dolor voluptatem porro dolore labore quaerat porro ipsum. Eius dolore sit tempora etincidunt non. Dolore neque aliquam neque. Dolore velit quaerat dolorem quaerat quiquia. Porro velit ipsum quisquam.
Eius quiquia quiquia labore consectetur sed dolorem. Sed ut est non. Porro adipisci dolore sit aliquam adipisci quisquam porro. Tempora modi adipisci consectetur modi eius neque ut. Amet consectetur aliquam quiquia dolor velit. Est velit tempora est. Numquam consectetur aliquam etincidunt consectetur amet.
Aliquam quisquam tempora quaerat tempora modi ipsum. Velit magnam sed non aliquam ut. Est adipisci tempora quisquam consectetur tempora quiquia ipsum. Quiquia non modi aliquam labore sed ipsum. Labore velit eius amet etincidunt. Adipisci amet quaerat modi adipisci. Non quiquia est amet adipisci voluptatem non tempora. Dolore velit porro dolorem. Dolorem modi dolore numquam labore ipsum. Consectetur dolor sed dolorem adipisci est aliquam etincidunt.
Eius quisquam tempora amet modi labore. Voluptatem ut adipisci dolore sed quisquam neque porro. Quaerat consectetur consectetur numquam dolor. Quisquam etincidunt numquam eius. Adipisci velit dolor quisquam velit amet porro. Amet tempora ipsum velit quisquam. Quiquia dolor velit sit. Tempora consectetur magnam sit consectetur dolor tempora eius. Dolor ipsum dolor modi quiquia modi eius.
Modi porro sit eius dolore. Sed consectetur quiquia eius aliquam velit quisquam velit. Magnam quisquam ut dolor dolor consectetur non. Aliquam etincidunt aliquam numquam. Sit voluptatem adipisci est ipsum porro. Numquam dolore velit etincidunt eius est ipsum. Etincidunt modi consectetur est est porro eius. Quiquia neque velit amet ipsum. Aliquam neque numquam labore.
Est consectetur quaerat modi dolor. Sed est quiquia ipsum numquam dolorem quisquam. Quaerat modi velit sit ipsum. Eius sit sit modi porro. Consectetur aliquam dolore eius aliquam. Non est eius sit. Quisquam quaerat labore dolore amet neque est. Tempora neque amet tempora etincidunt eius adipisci dolor. Labore quiquia tempora non non quiquia. Eius porro consectetur quiquia dolore quiquia.
Labore numquam dolore numquam. Velit tempora voluptatem quiquia dolorem dolorem consectetur. Labore consectetur velit ut tempora dolorem quiquia. Dolorem amet consectetur dolore dolorem. Est ipsum eius dolor numquam modi. Voluptatem quisquam velit eius. Ut quisquam eius dolorem. Consectetur adipisci numquam non dolore neque. Tempora non est dolore neque porro velit.
Dolorem neque est ipsum porro ut amet. Eius ut voluptatem quaerat adipisci ipsum. Non sit tempora dolore labore tempora magnam. Quiquia numquam aliquam quiquia. Voluptatem magnam tempora sed aliquam adipisci aliquam labore. Dolorem dolore amet modi. Velit tempora non quaerat sit. Tempora voluptatem magnam consectetur dolorem quiquia est. Non ut neque sit voluptatem sed neque velit.
Aliquam velit labore adipisci adipisci voluptatem modi non. Non dolor quiquia modi modi voluptatem quisquam neque. Eius ipsum velit quiquia quaerat non quaerat dolore. Amet aliquam dolorem labore. Dolore ut consectetur modi voluptatem consectetur magnam numquam. Etincidunt velit est ipsum velit dolore. Ut dolor labore voluptatem dolore amet. Sit consectetur voluptatem etincidunt dolorem magnam. Neque sed numquam numquam sed ipsum.
Magnam amet quisquam labore voluptatem velit. Magnam modi est labore quaerat. Adipisci labore dolor dolorem quisquam magnam ut. Velit eius dolorem quisquam eius amet. Sed velit quisquam non.
Porro amet quaerat etincidunt. Magnam modi quaerat sed ut est modi modi. Labore velit magnam numquam tempora. Est amet ipsum neque quaerat ut labore. Neque dolor numquam dolore dolorem quaerat aliquam. Etincidunt aliquam est voluptatem amet.

 

#include <stdio.h>


int main()
{
    char nazwa_pliku[31];
    FILE *wsk_file_read;
    FILE *wsk_file_write;
    int chr;
    int end_read;

    printf("Podaj sciezke do pliku:");
    scanf("%30s",nazwa_pliku);
    wsk_file_read=fopen(nazwa_pliku,"rb");
    if(wsk_file_read==NULL)
    {
        printf("Couldn't open file");
        return 4;
    }
    printf("Podaj sciezke do pliku wyjsciowegp:");
    scanf("%30s",nazwa_pliku);
    wsk_file_write=fopen(nazwa_pliku,"wb");

    if(wsk_file_write==NULL)
    {
        if(wsk_file_read!=NULL)
            fclose(wsk_file_read);

        printf("Couldn't create file");
        return 5;
    }

    fseek(wsk_file_read,0L,SEEK_END);
    end_read=ftell(wsk_file_read);

    for(long n=1;n<=end_read;n++)
    {
        fseek(wsk_file_read,-n,SEEK_END);
        chr=getc(wsk_file_read);
        if(chr!='\032' && chr!='\r')
        {
            putc(chr,wsk_file_write);
        }
    }
    printf("File copied");
    if(wsk_file_read!=NULL)
        fclose(wsk_file_read);
    if(wsk_file_write!=NULL)
        fclose(wsk_file_write);
    return 0;
}



szczerze powiedziawszy siedze nad tym problemem i nie mam pojecia co moze byc przyczyna.
Mialem kilku podejrzanych np .putc ze moze generuje blad ale zamiana na fscanf nie pomogla
W zasadzie to wydaje mi sie ze program jest poprawny ,jak wrzucam do CLiona/CodeBlocks nie mam zadnych komunikatow wiec wydaje sie ze wszystko ok.

Wiec jakby ktos rzucil okiem i podsunal mozliwa sugestie/przyczyne bledu bylbym wdzieczny

1 odpowiedź

+1 głos
odpowiedź 22 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)

Nie podoba mi się linijka

if(chr!='\032' && chr!='\r')

Możesz wyjaśnić dlaczego usuwasz te dwa symbole z tekstu wynikowego?

komentarz 22 kwietnia 2020 przez reken Początkujący (390 p.)
edycja 22 kwietnia 2020 przez reken
#include <stdio.h>


int main()
{
    char nazwa_pliku[31];
    FILE *wsk_file_read;
    FILE *wsk_file_write;
    int chr;
    int end_read;


    printf("Podaj sciezke do pliku:");
    scanf("%30s",nazwa_pliku);
    wsk_file_read=fopen(nazwa_pliku,"r");
    if(wsk_file_read==NULL)
    {
        printf("Couldn't open file");
        return 4;
    }

    printf("Podaj sciezke do pliku wyjsciowegp:");
    scanf("%30s",nazwa_pliku);
    wsk_file_write=fopen(nazwa_pliku,"w");

    if(wsk_file_write==NULL)
    {
        if(wsk_file_read!=NULL)
            fclose(wsk_file_read);

        printf("Couldn't create file");
        return 5;
    }

    fseek(wsk_file_read,0L,SEEK_END);
    end_read=ftell(wsk_file_read);

    for(long n=1;n<=end_read;n++)
    {
        fseek(wsk_file_read,-n,SEEK_END);
        chr=getc(wsk_file_read);

        putc(chr,wsk_file_write);
    }
    
    if(wsk_file_read!=NULL)
        fclose(wsk_file_read);
    if(wsk_file_write!=NULL)
        fclose(wsk_file_write);
    printf("File copied");
    return 0;
}



Dobra usunalem ten warunek zupelnie.Sprawdzilem w trybie binarnym i tekstowym wynik ten sam linijka jedna wiecej. Wrzucilem w testy ,rezultat ten sam co poprzednio(o dziwo) przechodzi kilka testow i zacina sie na powiedzmy 4 lub 6 tescie i wyrzuca ten sam komunikat.

Podaj sciezke do pliku:seemclassraceblowwon'teverypick.txt⏎
Podaj sciezke do pliku wyjsciowegp:File copiedhim⏎
   Program zakończony; kod błędu=0 (Ok)
   Blad wczytywania pliku him


Czy jest mozliwosc ze scanf podczas pobierania nazwy generuje problem?Moge pobrac max nazwe 30 znakow zazwyczaj wyrzuca blad gdy nazwa piewrszego pliku jest dluga .Staram sie znalezc blad choc nie wiem czy to dobry trop.Wszelkie sugestie mile widziane

komentarz 22 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)

Otwórz plik w trybie binarnym i dodaj specjalną obsługę sekwencji "/r/n"

    for(long n=1;n<=end_read;n++)
    {
        fseek(wsk_file_read,-n,SEEK_END);
        chr=getc(wsk_file_read);
        if (chr == '\n' && n < end_read) {
            fseek(wsk_file_read,-n-1,SEEK_END);
            char chr2 = getc(wsk_file_read);
            if (chr2 == '\r') {
                putc(chr2,wsk_file_write);
                putc(chr,wsk_file_write);
                n++;
                continue;
            }
        } 
        putc(chr,wsk_file_write);
    }
komentarz 22 kwietnia 2020 przez reken Początkujący (390 p.)

Faktycznie przeszlo wielkie dzieki.Ale teraz moje pytanie jak mozna;-)

Pobierasz znak,sprawdzasz czy jest rowny '\n' i czy jest mniejszy od n<end_read

chr == '\n' && n < end_read)

wiekszy nie moze byc bo by nie ruszyla petla for zatem moze byc ewentualnie rowny wiec jest to sprawdzane po to abys od wartosci 0(przy ostatniej iteracji) nie odejmowal 1?

Wrzucilem wczesniej cos takiego

fseek(wsk_file_read,0L,SEEK_END);
   end_read=ftell(wsk_file_read);
 
   for(long n=1;n<=end_read;n++)
   {
       fseek(wsk_file_read,-n,SEEK_END);
       chr=getc(wsk_file_read);
 
       if(chr=='\n')
           last_char=chr;
       else if ( chr=='\r' && last_char=='\n') {
           putc('\r', wsk_file_write);
           putc('\n',wsk_file_write);
       }
       else
       {
           putc(chr,wsk_file_write);
       }

Mozesz choc po krotce wyjasnic mi dlaczego to nie zadzialo.Przeciez gdy pobralem znak i byl on '\n' zapisywal (powinien) do last_char i przy kolejnym pobraniu znaku powinien to byc'\r' zatem linijka

 else if ( chr=='\r' && last_char=='\n')

powinna sie wykonac.

Ty zrobiles to na zasadzie pobrania znaku i jesli to byl '\n' przesunieciu wskaznika o 1 i sprawdzeniu od razu czy kolejny to '\r'.Wydaje mi sie ze jakby mechanizm podobny ale nie zadzialal zatem mozesz mi powiedziec gdzie jest blad w moim mysleniu.

Wdziecznosc podwojna smiley

komentarz 22 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)

Warunkiem kontynuowania pętli jest n<=end_read aby móc odczytać następny znak musi zostać spełniony warunek n+1<=end_read, który inaczej można zapisać n<end_read.

Na tym wycinku który wstawiłeś nie widać czy zmienna last_char jest modyfikowana w innym miejscu.
Jeżeli nie to po natrafieniu na pierwszy znak '\n' do końca programu ma tą wartość.
W przypadku wystąpienia unixowego znaku końca linii (samo '\n') tracisz ten znak.

komentarz 23 kwietnia 2020 przez reken Początkujący (390 p.)
W zasadzie masz rację nie wziąłem pod uwagę pojedynczego znaku '\n' . Faktycznie w tym przypadku traciłbym znak. Wyszedłem z założenia że skoro jest problem z podwójnym znakiem to w innej konfiguracji nie wystąpi tj rozpatruje problem w systemach windows

Dzięki za pomoc. Głos++ polecial

Podobne pytania

0 głosów
1 odpowiedź 150 wizyt
pytanie zadane 14 maja 2020 w C i C++ przez Daim123 Użytkownik (530 p.)
0 głosów
0 odpowiedzi 156 wizyt
0 głosów
1 odpowiedź 112 wizyt
pytanie zadane 25 czerwca 2017 w PHP przez Spektral Początkujący (410 p.)

92,657 zapytań

141,551 odpowiedzi

319,990 komentarzy

62,026 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...