FreeBSD und Files

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

FreeBSD und Files

Beitrag von nufan » Mi Apr 08, 2009 2:01 pm

Hallo
In den letzten Tagen hab ich wieder ein bisschen bei EatTheBlocks weiterprogrammiert. Schließlich hab ich es sogar unter Windows zum Laufen bekommen ;)
Natürlich wollte ichs dann mal unter BSD versuchen. Also die Pakete für SDL und SDL_ttf runtergeladen, kopiert und installiert.
Das Programm erfolgreich mit gmake kompiliert. Es lässt sich auch problemlos spielen. Wenn ich in der Liste mit den Punkten aber mehr als einen Eintrag habe, wird der Rest einfach weggelassen.
Durch die Ausgabe des Return-Wertes von fwrite habe ich gemerkt, dass ich nicht in das File schreiben kann (Return-Wert = 0, normalerweise Anzahl der erfolgreich geschriebenen Elemente). D.h. ich kann zwar das File erstellen und was reinschreiben, aber nichts nachträglich einfügen.


So sieht die gekürzte Version des Codes aus:

Code: Alles auswählen

 if ((scorelist = fopen (".scores", "r + b")))                                             
  {

    nr = fread (scoresfromlist, sizeof (highscoreinfo), MAXSCORES, scorelist);                      

    rewind (scorelist);                                                                             
    
    for (i = 0; i < MAXSCORES && !entry; i++)                                                      
    {
            
      if (reachedscore > scoresfromlist[i].score)                                               
      {

        getname (newscore.name);                                                                   

        newscore.score = reachedscore;                                                             

        entryscore (i, nr, newscore, scoresfromlist);                                               

        newpos = i;                                                                          
        
	printf ("old nr of scores: %d\n", nr);
	
        if (nr < MAXSCORES)                                                                        
          nr++;                                                                                

        printf ("new nr of scores: %d\n", nr);

        int succ;
        succ = fwrite (scoresfromlist, sizeof (highscoreinfo), nr, scorelist);                             

	  printf ("%d scores successfully written to file\n", succ);             // 0

        entry = 1;                                                                              
      
        printf ("score entered\n");
      
      }       
          
        else if (i == nr && nr != MAXSCORES)                                                       
        {

          getname (newscore.name);                                                             

          newscore.score = reachedscore;                                                           

          scorecpy (&scoresfromlist[nr], newscore);                                            

          newpos = i;                                                                             
	
	printf ("old nr of scores: %d\n", nr);        
        
	  nr++;                                                                               
        
	printf ("new nr of scores: %d\n", nr);
	
	
	  int succ;
          succ = fwrite (scoresfromlist, sizeof (highscoreinfo), nr, scorelist);                          
          
	  printf ("%d scores successfully written to file\n", succ);                   // 0
	  
          entry = 1;                                                            

          printf ("score appended\n");

        }
    
    }
      
    fclose (scorelist);                                                                           

    printf ("new score at: %d\n", newpos);

    draw_highscorelist (newpos);                                                              

  }  
  
    else if ((scorelist = fopen (".scores", "wb")))                                                
    {  
      
      [...]
       
    }
Bei den printfs wird immer die korrekte Anzahl an Einträgen ausgegeben, aber fwrite gibt immer 0 zurück. Gibt es unter BSD irgendwelche Funktionen, die man meiden sollte? Funktioniert r + b (binäres Lesen und Schreiben) dort überhaupt?
Ich bin ratlos... Hätte es unter Windows auch nicht funktioniert hätte ich auf einen Fehler im Programm getippt, aber so... :?

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: FreeBSD und Files

Beitrag von Jside » Mi Apr 08, 2009 2:12 pm

Naja, ist ja POSIX standard, von daher dürfte fwrite & Co selbst unter IRIX/HP-UX AIX & Co gleich sein, even under UNICOS...

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: FreeBSD und Files

Beitrag von nufan » Mi Apr 08, 2009 2:22 pm

Jside hat geschrieben:Naja, ist ja POSIX standard, von daher dürfte fwrite & Co selbst unter IRIX/HP-UX AIX & Co gleich sein, even under UNICOS...
Mit fseek und fgetpos/fsetpos hab ichs auch schon probiert.
Ich hab da einen anderen Verdacht:
On streams open for update (read+write), a call to fseek allows to switch between reading and writing.
On streams open for update (read+write), a call to rewind allows to switch between reading and writing.
On streams open for update (read+write), a call to fsetpos allows to switch between reading and writing.
Quelle: http://www.cplusplus.com/reference/clibrary/cstdio/

"allows" oder macht automatisch? Kann es sein, dass das bei BSD aber nicht bei Ubuntu und Vista der Fall ist? Kann man das verhindern? Kann man irgendwie über die FILE-Struktur den Dateistatus (lesen/schreiben) abfragen?
Und zu guter letzt :) :
Gibt es eine Alternative außer das File neu aufzumachen?


EDIT:
Wenn ich das File neu aufmache funktionierts.

Antworten