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

Napisz program, który co drugą literę w pliku zamieni na znak ‘@'

Object Storage Arubacloud
+1 głos
972 wizyt
pytanie zadane 8 grudnia 2020 w C i C++ przez Radson09 Nowicjusz (190 p.)
#include <stdio.h>

int main()
{
    char ch;
    FILE* plik;
    plik = fopen("text2.txt", "r");
    char tresc[10000];
    int i = 0;
    while ((ch = getc(plik)) != EOF)
    {
        tresc[i] = ch;
        i++;
    }
    fclose(plik);
    for (int i2 = 0; i2 < i ; i++)
    {
        if (i2 % 2 == 0)
       {
           tresc[i2] = '@';
       }
    }
    plik = fopen("text2.txt", "w");
    for (int i2 = 0; i2 < i ; i++)
    {
        putc(tresc[i2], plik);
    }
    fclose(plik);
    return 0;

}

Ktoś może napisać, co robię źle ? Gdy mam plik tekstowy wypełniony tekstem to po uruchomieniu programu znika caly tekst zamiast zamieniać co drugą litere na @.

3 odpowiedzi

0 głosów
odpowiedź 8 grudnia 2020 przez tangarr Mędrzec (154,780 p.)
W drugiej i trzeciej pętli zwiększasz zmienną i zamiast i2.
W wyniku tego ustawiasz wartość tresc[0] na '@' tak długo aż wartość i się przekręci i będzie ujemna.
Trzecia pętla nie zostanie wykonana ani razu bo i jest ujemne.

Twoje rozwiązanie problemu jest bardzo złe. Nie masz żadnego zabezpieczenia przed wczytywaniem zbyt dużego pliku.

Najlepszym rozwiązaniem będzie:
1. Zapamiętaj rozmiar pliku
2. Otwórz plik w trybie do odczytu i zapisu
3. Ustaw pozycję w pliku na początku pliku
4. Tak długo aż pozycja w pliku jest mniejsza od jego rozmiaru wykonuj pętlę:
-  Jeżeli pozycja jest parzysta zapisz do pliku '@' w przeciwnym wypadku przesuń się o jeden bajt do przodu.
komentarz 8 grudnia 2020 przez tangarr Mędrzec (154,780 p.)

Po zobaczeniu odpowiedzi innego użytkownika (już niewidoczna) zauważyłem, że mam błąd. Nie zauważyłem, że w treści jest napisane co drugą literę. Myślałem, że co drugi znak.

Proponuję utworzenie dodatkowej zmiennej bool informującej czy zamienić aktualną literę.
 

// typ bool jest zdefiniowany w nagłówku <stdbool.h>

bool replaceLetter = true;
for ( ... ) { // jakaś pętla wczytująca znak c
    if (isaplha(c)) {
        if (replaceLetter)
            c = '@';
        replaceLetter = !replaceLetter;
    }
    // zapisujemy c do pliku
}

 

0 głosów
odpowiedź 8 grudnia 2020 przez VBService Ekspert (253,120 p.)
edycja 8 grudnia 2020 przez VBService

Moja propozycja:

- jedna pętla,
- zapis do nowego pliku (bez nadpisywania oryginału),
- bez: char tresc[10000],
- zamiana tylko liter - co drugą (na razie bez polskich ogonków) wink


[ edit ]


#include <stdio.h>
 
int main()
{
    char ch;
    FILE* file_in;
    FILE* file_out;
    file_in = fopen("text.txt", "r");
    file_out = fopen("text_at.txt", "w");
    
    int i = 0;
    while ((ch = getc(file_in)) != EOF)
    {
        ++i;
        if (ch == 32) i = 0;
        if ((ch >= 65 && ch <= 90) || (ch >= 97 && ch <= 122))
            if (i % 2 == 0)
                putc('@', file_out);
            else
                putc(ch, file_out);
        else
            putc(ch, file_out);
    }
    
    fclose(file_in);
    fclose(file_out);
    
    return 0;
}

text.txt

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi interdum metus leo,
ac lacinia ante aliquam viverra. Maecenas in ultricies enim. Proin et ullamcorper nisl.
Cras dolor ipsum, viverra quis sapien non, varius placerat lorem. Nulla ut cursus risus.
Ut at euismod diam, nec accumsan felis. Aenean sit amet dapibus orci, 12 vel faucibus elit.
Aliquam a urna sapien. Suspendisse tincidunt imperdiet nisl et tincidunt.
Pellentesque convallis velit at dui ultrices sodales. Vivamus nec semper ipsum.
Nunc tincidunt augue quis dui blandit semper. Nullam eget dignissim ligula.
In blandit augue quam, et pellentesque justo tempor eu. Nam faucibus tempor lacus at efficitur.
Phasellus sodales magna venenatis quam mollis, eget convallis quam semper.
In semper metus non nunc tempor, vel iaculis sapien accumsan.
Nunc vel massa quis libero fermentum sodales ut eget ligula.
Suspendisse pharetra accumsan sapien nec commodo. Integer libero arcu, imperdiet eget scelerisque a, sagittis at felis.
Aenean venenatis lacus sed sagittis gravida. Integer et quam et eros accumsan gravida.
Fusce imperdiet augue elit, et tincidunt erat gravida accumsan.
Pellentesque nec est sit amet ipsum placerat consequat. Nulla vehicula congue magna in varius.
Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
In rhoncus nibh sit amet ex pretium maximus. Etiam lacus nisi, ornare sed felis ut, porttitor ultricies risus.
Ut in diam sit amet mi pulvinar tincidunt non at ante. Fusce lacinia condimentum rutrum.
Suspendisse at quam id lorem hendrerit pretium. Vestibulum volutpat odio lectus, eget commodo ligula semper ut.
Nullam nulla orci, cursus eget consequat vitae, dapibus at lacus. Aliquam interdum pretium ex vitae feugiat.
Nulla facilisi. Donec ac ligula in sem euismod molestie.
Integer laoreet gravida sapien, sit amet ullamcorper neque facilisis vitae.
Vestibulum porttitor, ligula in tincidunt egestas, eros risus porttitor tellus, nec sagittis nunc orci nec est.
Nunc lectus nulla, lacinia in consectetur sagittis, tempor a ipsum.
Sed eu odio malesuada, molestie nulla sollicitudin, interdum magna. 
Proin ut luctus urna, quis hendrerit ligula. Phasellus vulputate massa sed nisl accumsan, nec lacinia nulla pulvinar.
Sed viverra risus magna, ut euismod quam mattis nec. Nullam convallis rhoncus ipsum eu vestibulum.
Cras et eros sodales, tempor erat vitae, facilisis felis. Vivamus vel massa dapibus, lacinia augue eget, euismod mauris.
Morbi eu leo posuere, scelerisque purus molestie, auctor ante.
Ut sed odio feugiat, luctus nibh sit amet, dapibus massa. Aenean et est dignissim, accumsan purus sed, aliquam dolor.
Maecenas dapibus tempor nisi, non bibendum tortor placerat vitae. Nam quis vulputate ante.
Ut pretium, erat id congue imperdiet, libero ipsum ullamcorper eros, ac rhoncus elit nulla et nulla.
In tristique massa lectus, eu malesuada diam maximus sit amet. Phasellus euismod at purus a placerat.
Mauris nunc magna, rutrum a laoreet nec, luctus ac tortor. Suspendisse bibendum nec ex a ultricies.
Ut sagittis ante tristique urna convallis cursus id malesuada felis.
Curabitur ac velit eu tortor placerat tempus vel a lorem. Donec non velit ex.
Aenean vestibulum elit eget pharetra interdum. Ut nisi purus, congue in sapien nec, sodales vehicula arcu.
Donec at sapien ante. Praesent facilisis velit at sem pulvinar, in eleifend lectus eleifend.
Duis eu luctus leo, non viverra nulla. In volutpat risus dui, in convallis purus tincidunt ut.
Phasellus nisi diam, vehicula sed mauris at, venenatis dignissim lacus. Sed ac mi id orci interdum convallis.
Mauris condimentum dictum mi nec interdum.

komentarz 8 grudnia 2020 przez tangarr Mędrzec (154,780 p.)

Oprócz liter, spacji, znaków nowej linii, przecinków i kropek dokument może zawierać również cyfry i resztę znaków specjalnych.
Oprócz tego, twoje rozwiązanie będzie zamieniać tylko litery na parzystych indeksach.

_a_l_a_m_a_k_o_t_a_

 

komentarz 8 grudnia 2020 przez VBService Ekspert (253,120 p.)

@tangarr, dziękuję za uwagi, już poprawione. wink

0 głosów
odpowiedź 9 grudnia 2020 przez mokrowski Mędrzec (155,460 p.)
#include <stdio.h>
#include <ctype.h>
#include <errno.h>
#include <stdlib.h>

#define FILENAME "text.txt"

void change_char_at(FILE * file) {
	char ch;
	size_t counter = 0;
	while((ch = getc(file)) != EOF) {
		if(isalpha(ch)) {
			if(counter & 0x01) {
				fseek(file, -1, SEEK_CUR);
				fputc('@', file);
			} 
			++counter;
		}
	}
}

int main(void) {
	FILE * file;
	file = fopen(FILENAME, "r+");
	if(file == NULL) {
		perror(FILENAME);
		return EXIT_FAILURE;
	}
	change_char_at(file);
	fclose(file);
	return EXIT_SUCCESS;
}

 

Podobne pytania

0 głosów
1 odpowiedź 545 wizyt
0 głosów
1 odpowiedź 671 wizyt
0 głosów
1 odpowiedź 375 wizyt

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,940 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!

...