Text bearbeiten



  • Hallo habe folgendes Problem. Will eine txt Datei öffnen an eine Stelle "stelle" springen und dann eine Zeile mit der Größe "groeße" löschen.
    Komm aber nicht so richtig dahinter. Dachte mir so ungefair

    Datei = fopen ("c:\\zwischen.txt" , "rw"); //datei in der geändert werden soll öffnen
    fseek(datei,stelle,SEEK_SET); // an die stelle springen
    ?? //zeile ab "stelle löschen keine Ahnung wie( also die nächsten Zeichen der anzahl "größe" löschen)
    


  • am einfachsten wäre es wenn du die datei komplett einliest und mit dem geändertem text neu reinschreibst.



  • Eine Löschfunktion wirst Du nicht finden. Du kannst ja auch nicht aus einem C-Array per Befehl in der Mitte etwas rauslöschen.

    Hilft nur - wie mein Vorgänger schon schrieb - die Datei neu schreiben.



  • Ja so habe ich es gemacht. Es geht darum eine TextDatei die in 3 Spalten mit bis zu 1Mio Zeilen zu ordnen. Wenn ich es so mache dauert fast doppelt so lange. Dachte ich die Rechenzeit ein bisschen verkürzen denn bei meinen Programm braucht mein rechner schon 4 Stunden für 20000 Zeilen.



  • Ich würde sagen es ist an der Zeit sich Gedanken über ein Datenbank-System zu machen. Das dürfte wesentlich schneller und einfach handzuhaben sein.

    Gruß



  • oder n ordentlicher such / sortieralgorithmus



  • Welchen Sortieralgorithmus würdet ihr zum Sortieren einer Text Datei empfehlen und bis zu wieviel mal so schnell kann ein solcher sortieren. Jetzt geht mein Programm die ganze Datei durch, nimmt sich die kleinste Zeile, schreibt sie in die geordnete Datei und löscht diese Zeile aus der Datei (Indem es alle Zeilen speichert die ungleich der grad raus genommenen sind). Das wiederholt mein Programm bis alle Zeilen aus der Ausgangsdatei gelöscht sind. Es wäre gut wenn der Algorithmus schnell wäre, aber nicht zu schwer zu implementieren ist.
    Die Datei ist nicht in binär Format. Also müssen die Zahlen immer erst in float konvertiert werden bevor ich sie vergleiche.



  • hab mich grad mal über Sortieralgorithmen belesen. Denke bald dass in meinen Fall eher noch eine längere Rechenzeit entstehen würde. Wenn ich beispielsweise Quicksort nehmen würde müsste ich ja ziemlich oft springen und neue Felder eröffnen. Das springen in einer Text Datei hat ja einen gewissen Aufwand. Da ich die Zeilen mit nehmen muss, müsste ich bei 20000 Zeilen zwischenzeitlich ja 20000 Dateien anlegen und diese dann zusammenfügen. Oder sehe ich das jetzt falsch? Gebe einfach mal mein Code mit, vielleicht sieht ja jemand was auf Anhieb wie ich Rechenzeit sparen kann, wenn nicht ist auch egal

    dateisortierennachx(int anzahlx)        ///////////////sortiert Datei nach x
    {
    
       CopyFile("c:\\testdaten.txt", "c:\\zwischen.txt", TRUE);
       std::ofstream file; 
       file.open("c:\\geordnet.txt"); 
    
    	int z;
    	for (z=1;  z<=anzahlx; z=z+1)
    	{
    
    	cout << z<<endl;
    
    	Datei = fopen ("c:\\zwischen.txt" , "r");
    
    	char abd[20];
    	char buffer1[100];
    	char bufferablage[100];
    	memset(buffer1,0,100);
    	memset(bufferablage,0,100);
    	int i=-1,i2=-1,merker=0;
        float zwischen; float anfang=100000;
    	short int zeile;
    	//////////////////////////////////////////////////////////kleinste suchen und in Datei schreiben
    	while(1) 
       { 
    	   i=i +1;
           i2=i2+1;
    	   zwischenstelle = zwischenstelle+1;
    	   zeile=zeile+1;
          cRead=fgetc(Datei); 
          if(feof(Datei)) 
          { 
             buffer1[i2]='\n';
    					buffer1[i2+1]=0;
    
    					if (zwischen <anfang)
    						{
    							  // /n machen
    							memset(bufferablage,0,100);
    							memcpy(bufferablage,buffer1,100);////buffer machen
    						}
    					memset(buffer1,0,100);
    				    memset(abd,0,20);
    					merker=0;
    					i=-1;
    					i2=-1;
    
             break; 
          } 
    
    	  switch(cRead) 
    		{ 
    
    	  case '0': {abd [i]='0';buffer1[i2]='0';
    		  break;}
          case '1': {abd [i]='1';buffer1[i2]='1';
    		  break;}
    	  case '2': {abd [i]='2';buffer1[i2]='2';
    		  break;}
    	  case '3':{ abd [i]='3';buffer1[i2]='3';
    		  break;}
    	  case '4':{abd [i]='4';buffer1[i2]='4';
    		  break;}
    	  case '5':{ abd [i]='5';buffer1[i2]='5';
    		  break;}
    	  case '6':{ abd [i]='6';buffer1[i2]='6';
    		  break;}
    	  case '7':{ abd [i]='7';buffer1[i2]='7';
    		  break;}
    	  case '8':{ abd [i]='8';buffer1[i2]='8';
    		  break;}
    	  case '9':{ abd [i]='9';buffer1[i2]='9';
    		  break;}
    		case '.':{ abd [i]='.';buffer1[i2]='.';
    			break;}
    		case ' ':{ 
    
    					if (merker==0) {
    						zwischen=atof(abd);
    						merker=1;}
    					buffer1[i2]=' ';
    					memset(abd,0,20);
    					i=-1;
    					break;
    				  }
    
    		case '\n': {
    					buffer1[i2]='\n';
    					buffer1[i2+1]=0;
    
    					if (zwischen <anfang)
    						{
    
    							memset(bufferablage,0,100);
    							memcpy(bufferablage,buffer1,100); ////buffer machen
    						}
    					memset(buffer1,0,100);
    				    memset(abd,0,20);
    					merker=0;
    					i=-1;
    					i2=-1;
    					zeile=0;
    					break;
    				   }
    
    		}
    
       }//while ende 
    
       file << bufferablage; 
       memset(buffer1,0,100);
       memset(abd,0,20);
       i=-1;
       i2=-1;
       merker=0;
       fclose (Datei); 
       ////////////////////////////////////////////////////löschen von zeile
    
       Datei = fopen ("c:\\zwischen.txt" , "r");
       std::ofstream file2; 
       file2.open("c:\\zwischen2.txt");
    
       float austausch=zwischen;
       anfang=100000;
       while(1) 
       { 
    	   i=i +1;
           i2=i2+1;
          cRead=fgetc(Datei); 
          if(feof(Datei)) 
          { 
    
    		  buffer1[i2]='\n';
    		  if (memcmp(bufferablage,buffer1,100)!=0)
    			 {
    			 	file2 << buffer1; 						
    
    			 }
    		 memset(buffer1,0,100);
    		 memset(abd,0,20);
    		 merker=0;
    		 i=-1;
    		 i2=-1;
    		 break; 
          } 
    
    	  switch(cRead) 
    		{ 
    
    	  case '0': {abd [i]='0';buffer1[i2]='0';
    		  break;}
          case '1': {abd [i]='1';buffer1[i2]='1';
    		  break;}
    	  case '2': {abd [i]='2';buffer1[i2]='2';
    		  break;}
    	  case '3':{ abd [i]='3';buffer1[i2]='3';
    		  break;}
    	  case '4':{abd [i]='4';buffer1[i2]='4';
    		  break;}
    	  case '5':{ abd [i]='5';buffer1[i2]='5';
    		  break;}
    	  case '6':{ abd [i]='6';buffer1[i2]='6';
    		  break;}
    	  case '7':{ abd [i]='7';buffer1[i2]='7';
    		  break;}
    	  case '8':{ abd [i]='8';buffer1[i2]='8';
    		  break;}
    	  case '9':{ abd [i]='9';buffer1[i2]='9';
    		  break;}
    		case '.':{ abd [i]='.';buffer1[i2]='.';
    			break;}
    		case ' ':{ 
    
    					if (merker==0) {
    						zwischen=atof(abd);
    						merker=1;}
    					buffer1[i2]=' ';
    					memset(abd,0,20);
    					i=-1;
    					break;
    				  }
    
    		case '\n': {
    					buffer1[i2]='\n';
    
    					if (memcmp(bufferablage,buffer1,100)!=0)
    						{
    							 	file2 << buffer1; 						
    
    						}
    					memset(buffer1,0,100);
    				    memset(abd,0,20);
    					merker=0;
    					i=-1;
    					i2=-1;
    					break;
    				   }
    
    		}	
       }/
       file2.close();
       fclose(Datei); 
       DeleteFile("c:\\zwischen.txt");
       CopyFile("c:\\zwischen2.txt", "c:\\zwischen.txt", TRUE);
       DeleteFile("c:\\zwischen2.txt");
    
    }//ende For Schleife
    
       DeleteFile("c:\\zwischen.txt"); 
       }
    

Anmelden zum Antworten