logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zamienić co piąty wyraz na domek w pliku tekstowym w C++?

Heroic 07 Maj 2005 13:25 1469 2
REKLAMA
  • #1 1469534
    Heroic
    Poziom 11  
    Posty: 28
    Na laboratoria z informatyki mam napisać program w C++, który w pliku tekstowym, co piąty wyraz zamieni na inny (wcześniej zdefiniowany, ma być "domek"), a wynik pracy zapisze do nowego pliku. Nie mam pojęcia jak to napisać, mam kilka pomysłów i proszę o radę, który lepszy:

    1) Napisać funkcję copy, insert i delete i zrobić to string po stringu. Tu nie ma ograniczenia co do wielkości pliku, ale będą się chyba pojawiać problemy na końcu lini (jak wyraz zamieniany będzie dłuższy).
    2) Skopiować cały plik do tablicy dwuwymiarowej, w której są na przemian wpisane wyrazy i stojące między nimi spacje. Tutaj by było najprościej, ale taka tablica nie może być za długa (właśnie jaka może być maksymalna wielkość takiej tablicy?).
    3) Napisać to bez funkcji z wykorzystaniem bufora i dwóch zmiennych, które pokazują początek i koniec co piątego wyrazu.

    Bardzo byłbym wdzięczny za każdą pomoc. Może ktoś z Was miał kiedyś do napisania podobny program, więc każda linijka kodu będzie mile widziana ;)
    Pozdrawiam!
  • REKLAMA
  • #2 1469581
    ZeeWolf
    Poziom 28  
    Posty: 989
    Pomógł: 115
    Ocena: 58
    Witam. Proponuje:
    1. Utworzyc plik tekstowy.
    2. Kopiowac znaki z jednego pliku do drugiego.
    3. Co piata spacja nastepuje 'podmiana' - czyli wstawienie wyrazu do pliku wyjsciowego
    4. Zamkniecie plikow, skasowanie oryginalnego (lub nie) i zamiana nazwy.
    Zaleta jest dowolna dlugosc przetwarzanego pliku. Mozna tez buforowac operacje za pomoca niewielkiej tablicy.
    Pozdrawiam.
  • Pomocny post
    #3 1473704
    piotrek5001
    Poziom 24  
    Posty: 913
    Pomógł: 26
    Ocena: 22
    Miałem chwilkę czasu i napisałem dla Ciebie taki program. Mam nadzieję że się przyda. Pisałem w Microsoft Visual C++ 2005 (tej darmowej Becie).

    Program czyta z pliku "plik1.txt", a wynik zapisuje do "plik2.txt". Wyraz na który ma zostać zamieniony co piąty jest w zmiennej char *dodaj.

    Myślę, że bez problemu dostosujesz to dokładnie do swoich potrzeb (nazwy plików itp).

    Efekt działania programu wygląda tak:
    W pliku plik1.txt jest:

    Wyraz1 Wyraz2 Wyraz3 Wyraz4 Wyraz5 Wyraz6 Wyraz7 Wyraz8 Wyraz9 Wyraz10 Wyraz11 Wyraz12 Wyraz13 Wyraz14 Wyraz15 Wyraz16 Wyraz17 Wyraz18 Wyraz19 Wyraz20 Wyraz21 Wyraz22 Wyraz23 Wyraz24 Wyraz25 Wyraz26 Wyraz27 Wyraz28 Wyraz29 Wyraz30 Wyraz31 Wyraz32 Wyraz33 Wyraz34 Wyraz35


    Po odpaleniu program, tworzy się plik2.txt, w którym jest:

    Wyraz1 Wyraz2 Wyraz3 Wyraz4 domek Wyraz6 Wyraz7 Wyraz8 Wyraz9 domek Wyraz11 Wyraz12 Wyraz13 Wyraz14 domek Wyraz16 Wyraz17 Wyraz18 Wyraz19 domek Wyraz21 Wyraz22 Wyraz23 Wyraz24 domek Wyraz26 Wyraz27 Wyraz28 Wyraz29 domek Wyraz31 Wyraz32 Wyraz33 Wyraz34 domek



    Oto kod źródłowy:

    
    // zamiana.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <conio.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    #include <stdlib.h>
    
    char *dodaj_znak(char *tekst, char znak)      //Dodaje znak na koncu stringa
    {
    	char *nowy = (char *)malloc(strlen(tekst)+2); 
    	strcpy(nowy, tekst);
    	nowy[strlen(tekst)]=znak; 
    	nowy[strlen(tekst)+1]=0; 
    	return nowy;
    }
    
    
    int main(int argc, char* argv[])
    {
    	FILE *plik1 = fopen("plik1.txt", "rt");   //Plik oryginalny, otwarty do odczytu
    	FILE *plik2 = fopen("plik2.txt", "w");   //Plik wynikowy
    	char znak; //aktualnie czytany znak z pliku
    	int znak2 = 0; //dodawany znak do pliku (dla co piatego wyrazu)
    	int wyraz = 1; //aktualny wyraz z rozpoczetej piatki wyrazow
    	char *dodaj = "domek"; //na co zamienic co piaty wyraz
    
    	do
    	{	
    		znak = fgetc(plik1);
    		if(znak == 32)  //spacja
    		{
    			wyraz++;
    			if(wyraz == 5)
    			{
    				fputc(32, plik2);
    				do
    				{
    					fputc(dodaj[znak2], plik2);
    					znak2++;
    				} while (znak2 != strlen(dodaj));
    				wyraz = 1;
    				znak2 = 0;
    				do
    				{
    					znak = fgetc(plik1);
    					if(znak == EOF)
    					{
    						break;
    					}
    				} while (znak != 32);
    			}
    		} 		
    		fputc(znak, plik2);
    						
    	} while(znak != EOF);
    	
    
    	printf("\nGotowe!\n");
    	getch();
    	return 0;
    }
    
    


    Daję także cały projekt. Jest w załączniku. Jak pisałem, jest pod Visual C++ 2005.
    Mam nadzieję, że się przyda.
    Załączniki:
    • zamiana.rar (178.37 KB) Musisz być zalogowany, aby pobrać ten załącznik.
REKLAMA