C -- Porównanie lini w pliku

0

To mój pierwszy post więc witam wszystkich.

Chcę napisać sobie program do porównywania lini w pliku np:

tomek
kamil
jola 
tomek

Ma zostać coś takiego:

tomek
kamil
jola 

Czyli ma usuwać powtarzające się frazy.
Dopiero od nie dawna uczę się ansi c i mam problem nawet z wymyśleniem jak to zrobić i jakich funkcji użyć.

Kawałek kodu który wypociłem :


# #include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <ctype.h>
//#define MAX 5120
int main (int argc, char *argv[])
{	
	FILE *we, *wy; // declaration  indicators files
	char nazwa[256]; // memory for initial file
        char new_file[] = "_out.txt";	// name end's file
	int ch;
	int licznik = 0;
	//---
	//char buf1[MAX];
	//char buf2[MAX];
	//int a;
	//char LINE_NUMBER = 0;
	
	if(argc < 2)
	{
		printf("Launch program with factor:\n -help\n");
		printf("Example: rc -help");
		// help text
	}
	if(argc > 1 && strcmp(argv[1], "-help") == 0)
	{
		printf("Help:\n -help\n -p file_name\n -a licens\n ");
		printf("Example: rc -p file.txt");
		// help text
	}

	if(argc > 1 && strcmp(argv[1] , "-a") == 0)
	{
		puts("udalo sie");
	}
	if(argc ==  2 && strcmp(argv[1] , "-p") == 0 )
	{
		fprintf(stderr, "Example: %s -p file_name\n", argv[0]); 
		exit(0);
	}
	if(argc > 2 && strcmp(argv[1], "-p") == 0 &&  argv[2])
	{
		//we = argv[2];
		//printf("%s", argv[2]);
		  if((we = fopen(argv[2], "r")) == NULL)
		  {
			  fprintf(stderr, "no can open file \"%s\".\n",argv[2]);
			  exit(1);
		  }
		  strcpy(nazwa,argv[2]);
		  strcat(nazwa, new_file);
		  if((wy = fopen(nazwa, "w")) == NULL)
		  {
			  fprintf(stderr,"No can create file.\n");
			  exit(2);
		  }
		 
		while ((ch = fgetc( we)) != EOF)
			//licznik++	  
		  //strcmp(ch1, h);
		  fputc(ch, wy);
		  

			  
		  if(fclose(we) != 0 || fclose(wy) != 0){

			  fprintf(stderr,"Erorr with close files.\n");
			  exit(3);
		  }

	}	

	return 0;
}	
 

Mam nadzieje że wybaczycie mi moje teksty w kodzie po ang bo pewnie są w stylu kali jeść kali pić :) kod pewnie zresztą też. Na razie udaje mi się skopiować plik b.txt do pliku b.txt_out.txt. Na resztę nie mam pomysłu myślałem żeby to wczytać do tablicy ale tez za bardzo nie wiem jak.

Proszę o pomoc.
Pozdrawiam
unreal

0

Słabo znam c++ ale napisałem Ci coś takiego:

 
 ifstream odczyt("input.txt");  // odczyt
	 string linia, zawartosc;

	 string tab[10];  // ilosc maksymalna linijek w pliku
	 int poz = 0;

	 while (getline(odczyt, linia))
	 {
	 tab[poz] += linia;  // ładowanie pliku do tablicy
	 poz++;
	 }

	 int ile = 0;
	 for (int k=0; k<poz; k++)    // algorytm
	 {
	 if (tab[k] == "0") continue;

		for (int i = 0; i < poz-k; i++)
		{
		   if (tab[k] == tab[k+i])
		   {
			 ile++;
			 if (ile > 1)
			 {
			   tab[k+i] = "0";
			   ile--;
			 }

		   }
		}
	 ile=0;
	 }

	 ofstream zapis("output.txt");   // zapis
	 for (int i=0; i < poz; i++)
	 {
	  if (tab[i] == "0") continue;
	  zapis << tab[i]+ " ";
	 }
	 zapis.close();

}

Mam nadzieję ,że zrozumiesz o co chodzi.

0

Dla małych plików można by załadować całość do std::deque lub std::vector linia po linii, sprawdzając czy przypadkiem wczytana linia nie istnieje już w kontenerze, no i zapisać zawartość do pliku, linia po linii. ;)

0

obawiam się że to nie zadziała ponieważ ja pisze w ansi c a nie cpp. W cpp to juz znalazłem na necie pare kodów z porównywaniem zawartości plików ale w ansi c żadnego z tond i ten mój post.

0

A co tu ma niby nie zadziałać ? przecież wszystko jest na warunkach.
dodaj tylko:

#include <string>
#include <fstream>
using namespace std;
 

No chyba ,że u Ciebie aby cokolwiek zadziałało to musi być Ctrl+C i Ctrl+V
jeśli tak to się raczej nie bierz za programowanie:)

0
unreal napisał(a)

obawiam się że to nie zadziała ponieważ ja pisze w ansi c a nie cpp. W cpp to juz znalazłem na necie pare kodów z porównywaniem zawartości plików ale w ansi c żadnego z tond i ten mój post.

Moja wina, nie zwróciłem większej uwagi na tytuł wątku. ;)

W C masz tę samą logikę, tylko że zarządzać pamięcią musisz samemu. Do wczytywania linia po linii masz fgets(). Jeżeli masz pewność, że długość linii nie przekroczy danej wartości, to na nieco większą ustawiasz wielkość bufora. Jeżeli takiej gwarancji nie masz to używasz dynamicznego bufora i w razie potrzeby powiększasz go (realloc()).

Możesz też wczytywać linia po linii i zapisywać linie do drugiego pliku sprawdzając (wczytując i porównując) czy w tym drugim pliku dana linia już nie istnieje. Dzięki temu będziesz mógł bez problemu przetwarzać duże pliki. ;)

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