Seite 1 von 1

Filter Programm

Verfasst: Di Mai 01, 2012 1:53 pm
von gabeBU
Hallo zusammen

Ich habe ein Filterprogramm geschrieben und bin schon fast fertig. Es geht um das Filtern der Ausgabe der kompletten Oskar-Datenbank (siehe Anhang). Die Regeln sind gesetzt (bis auf ein paar nicht lösbare Zeilen, aber das ist jetzt nicht wichtig). Jetzt bei der Ausgabe in der .txt (siehe Anhang) wird bei jeder Zeile ein "*" ausgegeben, der eigentlich nur beim nominierten gewinner ausgegeben werden sollte und die Notes, die ich nicht haben möchte, werden auch wieder eingeschrieben. Ist es möglich das zu verhindern?

Hier ist der Code:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
//#include <windows.h>
#include <iostream>
#include <string>

using namespace std;

struct entry {
	string year;
};

bool is_number(const std::string& s)
{
   for (int i = 0; i < s.length(); i++) {
       if (!std::isdigit(s[i]))
           return false;
   }

   return true;
}

bool is_upper(const std::string& s)
{
     locale loc;
     char c;
     for (size_t i=0; i<s.length(); ++i)
     {
         c=s[i];
         if (!isupper(c,loc))
          return false;
     }
     return true;
}

bool is_afilm ( const std::string& s)
{
     return s.find_first_of("--") > -1;
}    
     
int main (void)
{
	FILE *datei;
	char line[1000];
	int i ;
	i = 500;

	datei = fopen ("oscardateien.txt", "r");
	char c;
	char a[20];
    const char *p;
    char abstand[] = ",";
	FILE * ausgabe = fopen("ausgabe.txt","w+");

	while(!feof(datei))
	{
		fgets(line,i,datei);

		string s_line (line);

	
		// year
		if(  s_line.find_first_of("--") == -1 && is_number(s_line.substr(0, 4)))
		{
			
			int yearEnd = s_line.find_first_of(' ');
		    
		     string year = s_line.substr(0,yearEnd);
			cout << year + "\n";
			p = year.c_str();
			strcpy( a, year.c_str());
			fprintf(ausgabe,a);
			fprintf(ausgabe,abstand);
            		}
		
		
       //category
     else  if (  s_line.find_first_of("--") == -1  && is_upper(s_line.substr(0,s_line.find_first_of(' '))))
       {
         cout << "Kategorie:" <<  s_line + "\n";
         	p = s_line.c_str();
			strcpy( a, s_line.c_str());
			fprintf(ausgabe,a);
			fprintf(ausgabe,abstand);
       }
       //film
    /*else   if (s_line.find_first_of("--") > string::npos)
       {
         cout << "Film:" >> s_line + "\n";
       }*/
       //Vorname
    else if (   s_line.find_first_of("*") != -1)
    {
         cout << "Gewinner:" << s_line;
         	strcpy( a, s_line.c_str());
			fprintf(ausgabe,a);
		
    }
     //notes
   else if (s_line.substr(0,5) == "[NOTE")
   {
    }
    
    //fliesstext
    else if ( s_line.find_first_of("--") == -1 && s_line.substr(0,2) == "To")
    {
         cout <<"Beschreibung" <<  s_line + "\n";
          	strcpy( a, s_line.c_str());
			fprintf(ausgabe,a);
			
    }
    //vorname
    
    else 
    {
         cout << "Film:" << s_line + "\n";		
    }
		//fprintf(ausgabe,line,c);
	}
  //music
  
  //sound
  
  //director
  
  //
  
	fclose (datei);


	system("PAUSE");
	return 0;
}


Gruss

GabeBU

Re: Filter Programm

Verfasst: Di Mai 01, 2012 4:44 pm
von Xin
gabeBU hat geschrieben:Hallo zusammen

Ich habe ein Filterprogramm geschrieben und bin schon fast fertig. Es geht um das Filtern der Ausgabe der kompletten Oskar-Datenbank (siehe Anhang). Die Regeln sind gesetzt (bis auf ein paar nicht lösbare Zeilen, aber das ist jetzt nicht wichtig). Jetzt bei der Ausgabe in der .txt (siehe Anhang) wird bei jeder Zeile ein "*" ausgegeben, der eigentlich nur beim nominierten gewinner ausgegeben werden sollte und die Notes, die ich nicht haben möchte, werden auch wieder eingeschrieben. Ist es möglich das zu verhindern?

Hier ist der Code:
Ich bekomme erstmal beim Kompilieren folgendes:

Code: Alles auswählen

xin@Trinity:~/Dokumente/Personen/gabeBU$ g++ oskar.cpp 
oskar.cpp: In Funktion »int main()«:
oskar.cpp:71:33: Fehler: »strcpy« wurde in diesem Gültigkeitsbereich nicht definiert
oskar.cpp:72:27: Warnung: Format ist kein Zeichenkettenliteral, und keine Formatargumente [-Wformat-security]
oskar.cpp:73:33: Warnung: Format ist kein Zeichenkettenliteral, und keine Formatargumente [-Wformat-security]
oskar.cpp:82:35: Fehler: »strcpy« wurde in diesem Gültigkeitsbereich nicht definiert
oskar.cpp:83:27: Warnung: Format ist kein Zeichenkettenliteral, und keine Formatargumente [-Wformat-security]
oskar.cpp:84:33: Warnung: Format ist kein Zeichenkettenliteral, und keine Formatargumente [-Wformat-security]
oskar.cpp:95:38: Fehler: »strcpy« wurde in diesem Gültigkeitsbereich nicht definiert
oskar.cpp:96:27: Warnung: Format ist kein Zeichenkettenliteral, und keine Formatargumente [-Wformat-security]
oskar.cpp:108:39: Fehler: »strcpy« wurde in diesem Gültigkeitsbereich nicht definiert
oskar.cpp:109:27: Warnung: Format ist kein Zeichenkettenliteral, und keine Formatargumente [-Wformat-security]
Nachdem ich statt <string> <string.h> einbinde, kann ich kompilieren.
Es kommen viele Ausgaben, gefolgt von:

Code: Alles auswählen

Gewinner:*
BeschreibungTo Jonathan Erland in appreciation for outstanding service and dedication in upholding the high standards of the Academy of Motion Picture Arts and Sciences. 
Bus-Zugriffsfehler (Speicherabzug geschrieben)
Ich befürchte, da musst Du zuerst ran.

Ansonsten verstehe ich noch nicht, was Du genau willst, vermutlich weil ich auch nichts von Oskars verstehe.

Re: Filter Programm

Verfasst: Do Mai 03, 2012 8:45 am
von gabeBU
Das Programm soll die Ausgabe der Datenbank so filtern, dass das Jahr, die Kategorie, die Nominierten, der Film, sowie die Gewinner mit einem Stern bezeichnet werden. Die Fehlermeldungen habe ich nicht erhalten...bei mir wird das Programm problemlos kompiliert.

Re: Filter Programm

Verfasst: Do Mai 03, 2012 9:19 am
von fat-lobyte
gabeBU hat geschrieben:Die Fehlermeldungen habe ich nicht erhalten...bei mir wird das Programm problemlos kompiliert.
Das liegt wahrscheinlich daran, dass du einen anderen Compiler verwendest. Wenn du für mehrere Plattformen kompilierst, solltest du dein Programm auch immer mit mehreren Compilern testen um dir sicher zu sein.
Wenn das nicht möglich sein sollte, solltest du zumindest in einer Referenz, z.B. hier: http://www.cplusplus.com/reference/ nachschauen, in welchen Headern sich die Funktionen tatsächlich befinden.

Übrigens: Bei manchen Menschen ist das Archivformat "RAR" nicht sehr beliebt, zum Beispiel bei mir.
Das liegt 1. daran, dass es bessere Algorithmen gibt (z.B. LZMA in 7zip) und 2. dass man zum Entpacken unfreie Software benötigt.

Weiter verbreitet sind .zip, .tar.gz, .tar.bz2, .tar.xz oder .7z.
Vor allem .7z und .tar.xz haben eine besser Kompressionsrate als RAR. Und alle Menschen können es aufmachen!

Re: Filter Programm

Verfasst: Do Mai 03, 2012 9:37 am
von Xin
gabeBU hat geschrieben:Das Programm soll die Ausgabe der Datenbank so filtern, dass das Jahr, die Kategorie, die Nominierten, der Film, sowie die Gewinner mit einem Stern bezeichnet werden.
Filtern bedeutet also schlussendlich nur, dass der Gewinnerfilm mit einem Stern gekennzeichnet wird?
gabeBU hat geschrieben:Die Fehlermeldungen habe ich nicht erhalten...bei mir wird das Programm problemlos kompiliert.
Ich kompilierte mit dem GCC 4.6 unter Ubuntu 12.04. Der Compiler ist recht aktuell.
Wenn Du <string> einbindest, dann befinden sich alle str...-Funktionen im Namespace std. Also std::strcpy z.B.
<string.h> ist die ältere Fassung, die die Funktionen im globalen Namensraum liegen hat.
Wenn Du keinen Plan hast, wovon ich rede, so ist das nicht schlimm: binde einfach die <string.h> ein. ;-)

Viel problematischer ist "Bus-Zugriffsfehler (Speicherabzug geschrieben)", der nebenher bei mir den kompletten Stack-Trace killt. Hier fliegt also irgendwann irgendwas in die Luft.
Kannst Du den Fehler nachvollziehen (welchen Compiler benutzt Du?)


Was .rar angeht - einfach zippen und fertig.
Dass .tar.xz weiter verbreitet als .rar ist, ist wohl sehr vom Kreis abhängig indem man guckt - die Endung kannte ich nämlich noch gar nicht. ^^
Bei .zip hat jedes OS in der Grundinstallation alles dabei.

Re: Filter Programm

Verfasst: Di Mai 08, 2012 10:13 am
von gabeBU
Ist doch völlig egal, wie ich es verpackt habe...-.- es geht ja um's Programm.

In der Schule nehmen wir Bloodsheet DEV C++ zum Compilieren und wie gesagt, dort sind keine Fehlermeldungen erschienen.

Re: Filter Programm

Verfasst: Di Mai 08, 2012 11:10 am
von Xin
gabeBU hat geschrieben:In der Schule nehmen wir Bloodsheet DEV C++ zum Compilieren und wie gesagt, dort sind keine Fehlermeldungen erschienen.
Ursache und Wirkung. ;-)

Der BloodSheet ist steinalt und fehlerhaft. Die aktuelle Version ist von Februar 2005! Das sind über 7 Jahre. Der MinGW ist ebenfalls meistens weit hinter dem GCC her und ich kompilierte Deinen Code mit einem Compiler, der bestenfalls ein paar Monate alt ist.
Biete Deinem Lehrer doch einfach an, sich auch mal hier anzumelden. Spontan fallen mir drei Entwicklungsumgebungen ein, die er stattdessen benutzen könnte.


Wie ist der aktuelle Stand? Kannst Du die Speicherzugriffproblematik nachvollziehen?