<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Code-Pruefen]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>Ich bin neu hier (und in C++) und hoffe das ist das richtige Forum.<br />
Ich habe für meine Schule ein Programm geschrieben, welches alle dateien in einem Ordner (&quot;share&quot;), die älter sind als 7 tage, loescht.<br />
Des weiteren sollen Dateien und Ordner, welche von Lehrern erstellt wurden, nicht geloescht werden.<br />
Habe den Quellcode soweit schon fertig. Könntet ihr mal drüber schauen und mir sagen, wo man etwas vlt. noch besser machen könnte?</p>
<pre><code>//standard input-output library
#include &lt;iostream&gt;
//um verzeichnisse auszulesen
#include &lt;dirent.h&gt;
//um strings zu benutzen
#include &lt;string&gt;
//um anhand uid uname zu bekommen
#include &lt;pwd.h&gt;
//um vektoren zu benutzen
#include &lt;vector&gt;
//z.B. für .c_str()
#include &lt;sys/stat.h&gt;
//um dateien zu lesen
#include &lt;fstream&gt;
//um zeit zu ermitteln
#include &lt;ctime&gt;
//um system-funktionen aufzurufen
#include &lt;cstdlib&gt;

using namespace std;

//wichtigste Variablen
const string SHAREPATH = &quot;/home/willi/Desktop/share/&quot;;
const int DAYS = 7;
vector&lt;string&gt;files(0);
vector&lt;string&gt;teachers(0);

//Liefert Dirs
struct dirent* entry;

//Liefert anhand uid uname
struct passwd* owner;

//Liefert Dateiinformationen
struct stat info;

//Funktionsprototypen
void showDir(DIR*);
int besitzerErmitteln(string);
int anzahlDateien(DIR*);
int readTeacherFile();
int checkFileMode(string&amp;);
int loescheFD(string&amp;, string);
string getFullPath(string&amp;);

int main(){
  DIR* share_p;

//tausch oeffnen
  if((share_p = opendir(SHAREPATH.c_str())) == NULL){
    cerr &lt;&lt; &quot;Tausch-Ordner konnte nicht geoeffnet werden!&quot; &lt;&lt; endl;
    return(1);
  }

//leherdatei lesen
  if(readTeacherFile() != 0){
    cerr &lt;&lt; &quot;teachers.list konnte nicht geoeffnet werden&quot; &lt;&lt; endl;
    return(1);
  }
//Dateien anzeigen + speichern
  showDir(share_p); 
//Jede Datei durchgehen
  for(int i = 0; i &lt; files.size(); i++){
//Auf Dateien/Files pruefen
    if(checkFileMode(files.at(i)) == 0){
//DIR
      loescheFD(files.at(i), &quot;rm -r &quot;);  
    }else{
//FILE
      loescheFD(files.at(i), &quot;rm &quot;);
    }
  }
  closedir(share_p);
  return(0);
}

void showDir(DIR* share_p){
  files.clear();
//alle verzeichnisse auslesen
  while((entry = readdir(share_p))){
//alle 'falschen' dateien ausschließen
    if(*entry-&gt;d_name != '.' &amp;&amp; besitzerErmitteln(entry-&gt;d_name) == 0){
      files.resize(files.size()+1);
      files.at(files.size() - 1) = entry-&gt;d_name;
      cout &lt;&lt; files.at(files.size() - 1) &lt;&lt; endl; 
    }
  }
} 

int besitzerErmitteln(string fdname){
  time_t datum_aktuell;
  datum_aktuell = time(NULL)/3600/24;
  int pruefe_lehrer = 0;  
//uid und uname ermitteln
  stat(getFullPath(fdname).c_str(), &amp;info);
  owner = getpwuid(info.st_uid);
//ersteller auf teacher pruefen
  for(int i = 0; i &lt; teachers.size(); i++){
    if(teachers.at(i).compare(owner-&gt;pw_name) == 0){
      pruefe_lehrer = 1;
      break;
    }
  }
//0, wenn datei nicht von lehrer &amp; zu alt
  if(pruefe_lehrer == 0 &amp;&amp; datum_aktuell - (info.st_mtime/3600/24) &gt; DAYS){
    return(0);
  }else{
    return(1); 
  }
  return 0;
}

int checkFileMode(string&amp; fdname){
    stat(getFullPath(fdname).c_str(), &amp;info);
//wenn file = directory -&gt; return 0
    if(info.st_mode &amp; S_IFDIR)
    {
      return(0);
    }else{
      return(1);
    }
}

int readTeacherFile(){
//teacherlist lesen und in vektor lesen
  ifstream teacherfile;
  string output;
  teacherfile.open(&quot;teachers.list&quot;);
  int zaehler = 0;
  if(teacherfile.is_open()){
    while(teacherfile.good()){
      getline(teacherfile, output);
//EOF aus array loeschen
      if(output != &quot;&quot;){
	teachers.resize(teachers.size() + 1);
	teachers.at(zaehler) = output;     
        zaehler++;
      }
    }
    teacherfile.close();
    return(0);
  }else{
    return(1);
  }
}

int loescheFD(string&amp; fdname, string delOperation){
  //File/Dir loeschen
  delOperation.append(getFullPath(fdname));
  if(system(delOperation.c_str())){
    return(0);
  }else{
    return(1);
  }
}

string getFullPath(string&amp; fdname){
  //fullpath ermitteln + return
  string filepath = SHAREPATH;
  filepath.append(fdname);
  return(filepath);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/310488/code-pruefen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 19:21:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310488.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Nov 2012 21:08:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Code-Pruefen on Mon, 12 Nov 2012 21:08:27 GMT]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>Ich bin neu hier (und in C++) und hoffe das ist das richtige Forum.<br />
Ich habe für meine Schule ein Programm geschrieben, welches alle dateien in einem Ordner (&quot;share&quot;), die älter sind als 7 tage, loescht.<br />
Des weiteren sollen Dateien und Ordner, welche von Lehrern erstellt wurden, nicht geloescht werden.<br />
Habe den Quellcode soweit schon fertig. Könntet ihr mal drüber schauen und mir sagen, wo man etwas vlt. noch besser machen könnte?</p>
<pre><code>//standard input-output library
#include &lt;iostream&gt;
//um verzeichnisse auszulesen
#include &lt;dirent.h&gt;
//um strings zu benutzen
#include &lt;string&gt;
//um anhand uid uname zu bekommen
#include &lt;pwd.h&gt;
//um vektoren zu benutzen
#include &lt;vector&gt;
//z.B. für .c_str()
#include &lt;sys/stat.h&gt;
//um dateien zu lesen
#include &lt;fstream&gt;
//um zeit zu ermitteln
#include &lt;ctime&gt;
//um system-funktionen aufzurufen
#include &lt;cstdlib&gt;

using namespace std;

//wichtigste Variablen
const string SHAREPATH = &quot;/home/willi/Desktop/share/&quot;;
const int DAYS = 7;
vector&lt;string&gt;files(0);
vector&lt;string&gt;teachers(0);

//Liefert Dirs
struct dirent* entry;

//Liefert anhand uid uname
struct passwd* owner;

//Liefert Dateiinformationen
struct stat info;

//Funktionsprototypen
void showDir(DIR*);
int besitzerErmitteln(string);
int anzahlDateien(DIR*);
int readTeacherFile();
int checkFileMode(string&amp;);
int loescheFD(string&amp;, string);
string getFullPath(string&amp;);

int main(){
  DIR* share_p;

//tausch oeffnen
  if((share_p = opendir(SHAREPATH.c_str())) == NULL){
    cerr &lt;&lt; &quot;Tausch-Ordner konnte nicht geoeffnet werden!&quot; &lt;&lt; endl;
    return(1);
  }

//leherdatei lesen
  if(readTeacherFile() != 0){
    cerr &lt;&lt; &quot;teachers.list konnte nicht geoeffnet werden&quot; &lt;&lt; endl;
    return(1);
  }
//Dateien anzeigen + speichern
  showDir(share_p); 
//Jede Datei durchgehen
  for(int i = 0; i &lt; files.size(); i++){
//Auf Dateien/Files pruefen
    if(checkFileMode(files.at(i)) == 0){
//DIR
      loescheFD(files.at(i), &quot;rm -r &quot;);  
    }else{
//FILE
      loescheFD(files.at(i), &quot;rm &quot;);
    }
  }
  closedir(share_p);
  return(0);
}

void showDir(DIR* share_p){
  files.clear();
//alle verzeichnisse auslesen
  while((entry = readdir(share_p))){
//alle 'falschen' dateien ausschließen
    if(*entry-&gt;d_name != '.' &amp;&amp; besitzerErmitteln(entry-&gt;d_name) == 0){
      files.resize(files.size()+1);
      files.at(files.size() - 1) = entry-&gt;d_name;
      cout &lt;&lt; files.at(files.size() - 1) &lt;&lt; endl; 
    }
  }
} 

int besitzerErmitteln(string fdname){
  time_t datum_aktuell;
  datum_aktuell = time(NULL)/3600/24;
  int pruefe_lehrer = 0;  
//uid und uname ermitteln
  stat(getFullPath(fdname).c_str(), &amp;info);
  owner = getpwuid(info.st_uid);
//ersteller auf teacher pruefen
  for(int i = 0; i &lt; teachers.size(); i++){
    if(teachers.at(i).compare(owner-&gt;pw_name) == 0){
      pruefe_lehrer = 1;
      break;
    }
  }
//0, wenn datei nicht von lehrer &amp; zu alt
  if(pruefe_lehrer == 0 &amp;&amp; datum_aktuell - (info.st_mtime/3600/24) &gt; DAYS){
    return(0);
  }else{
    return(1); 
  }
  return 0;
}

int checkFileMode(string&amp; fdname){
    stat(getFullPath(fdname).c_str(), &amp;info);
//wenn file = directory -&gt; return 0
    if(info.st_mode &amp; S_IFDIR)
    {
      return(0);
    }else{
      return(1);
    }
}

int readTeacherFile(){
//teacherlist lesen und in vektor lesen
  ifstream teacherfile;
  string output;
  teacherfile.open(&quot;teachers.list&quot;);
  int zaehler = 0;
  if(teacherfile.is_open()){
    while(teacherfile.good()){
      getline(teacherfile, output);
//EOF aus array loeschen
      if(output != &quot;&quot;){
	teachers.resize(teachers.size() + 1);
	teachers.at(zaehler) = output;     
        zaehler++;
      }
    }
    teacherfile.close();
    return(0);
  }else{
    return(1);
  }
}

int loescheFD(string&amp; fdname, string delOperation){
  //File/Dir loeschen
  delOperation.append(getFullPath(fdname));
  if(system(delOperation.c_str())){
    return(0);
  }else{
    return(1);
  }
}

string getFullPath(string&amp; fdname){
  //fullpath ermitteln + return
  string filepath = SHAREPATH;
  filepath.append(fdname);
  return(filepath);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2270278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270278</guid><dc:creator><![CDATA[Vaphen]]></dc:creator><pubDate>Mon, 12 Nov 2012 21:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to Code-Pruefen on Mon, 12 Nov 2012 22:17:59 GMT]]></title><description><![CDATA[<p>Zunächst einmal Stil:<br />
- <strong>Wichtig</strong>: Alle globalen Variablen weg! Die sorgen nur für komplizierte Fehler.<br />
- Mach unnötige Kommentare weg. Zum Beispiel:</p>
<pre><code>//um strings zu benutzen
#include &lt;string&gt;
</code></pre>
<p>Ach!<br />
- Mach falsche Kommentare weg. Zum Beispiel:</p>
<pre><code>//z.B. für .c_str()
#include &lt;sys/stat.h&gt;
</code></pre>
<p>Bestimmt nicht!<br />
- Mach irreführende Kommentare weg. Zum Beispiel:</p>
<pre><code>//Liefert Dirs
struct dirent* entry;
</code></pre>
<p>Das liefert gar nichts, das ist eine Variable, die enthält höchstens etwas.<br />
- return mit Klammern ist eher eine ungewöhnliche Schreibweise<br />
- Mach unnötige Anweisungen weg:</p>
<pre><code>teacherfile.close();
    return(0);
</code></pre>
<p>Und genau beim return würde der Dateistream automatisch zugehen (mal Referenz zum fstream-Destruktor durchlesen - Dateien schließen sich in C++ automatisch wenn sie aus dem Scope gehen). Also völlig unnötig.<br />
- Ich war ja nie ein Fan von erst Deklarieren, später definieren, wenn man sowieso den gesamten Quellcode in eine einzige Datei schreibt. Aber ist Geschmackssache. Erinnert mich jedenfalls immer an den Stil von Jürgen Wolf, daher eventuell zu unrecht negativ belegt.<br />
- Ich persönlich mag auch deinen Einrückungsstil nicht (auch wenn er durchaus so üblich ist). Das musst du nicht verbessern, aber ich gucke nicht so intensiv über das Programm, da ich es schlecht lesen kann.</p>
<p>Technik:<br />
- Es wäre eine Überlegung wert, die verbreitete und plattformunabhängige Boost-Bibliothek zu nutzen. Die hat auch einen Teil extra zum Arbeiten mit Dateisystemen (Boost Filesystem) und kapselt diesen ganzen C-Stil-Systemkram schön weg.<br />
- Das gilt ebenso für Datums- und Zeitverarbeitung<br />
- Lerne die Container richtig zu benutzen!</p>
<pre><code>teachers.resize(teachers.size() + 1);
    teachers.at(zaehler) = output;    
        zaehler++;
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Du programmierst die wohl wichtigste Methode des vectors, push_back, extrem umständlich nach.<br />
- Const correctness! Googeln, verstehen, anwenden! Das hilft dir, sehr viele Fehler gleich zur Compilezeit zu entdecken.<br />
- Potentiell große Datenpakete (string) sollten per (const-)Referenz an Funktionen übergeben werden, das spart Kopierarbeit.</p>
<p>Fehler die mir auffallen:<br />
- Logikfehler:</p>
<pre><code>while(teacherfile.good()){
      getline(teacherfile, output);
      // Verarbeitung
   }
</code></pre>
<p>Direkt aus einem der vielen schlechten Lehrbücher übernommen. Falls du so eines haben solltest: Wegwerfen!<br />
Du prüfst auf Erfolg (...good()), dann machst du etwas fehleranfälliges(getline), dann verarbeitest du das Ergebnis. Jetzt denk mal nach, was passiert, wenn der zweite Schritt schief geht. Typischerweise willst du so etwas wie</p>
<pre><code>while(getline(teacherfile, output))
{
 // Verarbeitung
}
</code></pre>
<p>Das war jetzt schon jede Menge, manches pingelig, manches ernst. Ich denke, du hast erst einmal zu tun. Wenn du alles (oder wenigstens vieles) verbessert hast, kann man noch einmal gucken. Dann wird auch alles viel übersichtlicher sein, dann kann man mehr verstehen und besser helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270294</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 12 Nov 2012 22:17:59 GMT</pubDate></item></channel></rss>