File lesen mit read -->dann wird file gelöscht



  • hallo leute!

    habe bisher nicht allzuviel erfahrung in c/c++ und möchte einen scanner für einen compiler schreiben. leider löscht mein scanner immer mein zu scannedes file.
    der code für den scanner ist in c geschrieben und wird mit c++ compiler compiliert.

    der code ist leider etwas lange aber wenn ich was auslasse kennt man sich vielleicht nicht aus

    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    
    int NO_BLOCKS_MORE=0, ERROR=-1, FILE_END=3;
    int BLOCKSIZE=64;
    
    struct charReader {
     char buffer[64];
     char actuelSym;
     int fh;
     int charsIn;
     int pos;
     int row;
     int column;
    };
    struct charReader reader;
    struct charReader lhReader; //lookahead Reader
    
    /*TOKENS*/ 
    
    int tabulator=9;
    int newline=10;
    int space=32;
    
    int assOp=0; //=
    int notOp=1; //!
    int addOp =2; //+
    int diffOp= 3; //-
    int multOp= 4; //*
    int divOp= 5;// /
    int ifSym = 6; //if
    int whileSym=7; //while
    int voidSym =8; //void
    int intSym =9; //int
    int charSym=10; //char
    int elseSym=11; //else
    int returnSym = 12;//return
    int adrOp=13; //&
    int externSym=14; //extern
    int structSym=15; //struct
    int andOp =16;//&&
    int orOp=17; //||
    
    int eqOp=18; //==
    int modOp=19; //%
    int greaterOp=20;//>
    int lessOp=21; //<
    int greaterEqOp=22; //>=
    int lessEqOp=23; //<=
    int notEqOp =24; //!=
    
    //klammern
    int leftBr=25; //(
    int rightBr=26; //)
    int lSetBr=27; //{
    int rSetBr=28; //}
    int lCornerBr=29; //[
    int rCornerBr=30; //]
    int semikolon=31; //;
    int comma=32;//,
    int highComma33; //'
    
    struct Token {
     int line,colum;
     int sym;
     int value;
    };
    
    /*liest nachsten Block des Files (BLOCKSIZE) in den char array buffer*/
    int readNextBlock(){
    reader.charsIn=read(reader.fh,reader.buffer,BLOCKSIZE);
    reader.pos=0;
    if(reader.charsIn==0) return NO_BLOCKS_MORE;
    if(reader.charsIn==-1) return ERROR;
    }
    
    /*liefert nächstes char eines Files wenn verwendeter Buffer gelesen wird Methode
    * readNextBlock aufgerufen um nachsten Block aus File zu lesen
    * Wenn Buffer zu Ende gelesen und keine weiteren Blöcke vorhanden -->FILE_END */
    void getNextSym(){
     if(reader.pos==reader.charsIn){
      int readNext=readNextBlock();
      if(readNext==NO_BLOCKS_MORE){
       reader.actuelSym= FILE_END; //TODO return FILE_END
      // return;
      }
      if(readNext==ERROR){
       reader.actuelSym =ERROR;
      // return;
     }
     }
    
     if(reader.actuelSym!=FILE_END && reader.actuelSym!=ERROR){
    
     reader.actuelSym= reader.buffer[reader.pos];
     reader.pos++;
     reader.column++;
     }
    
    }
    
    //lookahead
    /*liest nachsten Block des Files (BLOCKSIZE) in den char array buffer*/
    int readNextBlock2(){
    lhReader.charsIn=read(lhReader.fh,lhReader.buffer,BLOCKSIZE);
    lhReader.pos=0;
    if(lhReader.charsIn==0) return NO_BLOCKS_MORE;
    if(lhReader.charsIn==-1) return ERROR;
    }
    
    /*liefert nächstes char eines Files wenn verwendeter Buffer gelesen wird Methode
    * readNextBlock aufgerufen um nachsten Block aus File zu lesen
    * Wenn Buffer zu Ende gelesen und keine weiteren Blöcke vorhanden -->FILE_END */
    void getNextSym2(){
     if(lhReader.pos==lhReader.charsIn){
      int readNext2=readNextBlock2();
      if(readNext2==NO_BLOCKS_MORE){
       lhReader.actuelSym= FILE_END; //TODO return FILE_END
      // return;
      }
      if(readNext2==ERROR){
       lhReader.actuelSym =ERROR;
      // return;
     }
     }
    
     if(lhReader.actuelSym!=FILE_END && lhReader.actuelSym!=ERROR){
    
     lhReader.actuelSym= lhReader.buffer[lhReader.pos];
     lhReader.pos++;
    
     }
    
    }
    //END lookahead
    
    int isDigit(char sym){
     if(sym>='0' && sym <='9'){
     return 1;
     }
     else return 0;
    }
    
    int isLetter(char sym){
     if((sym>='a' && sym <='z') || (sym>='A' && sym <='Z')){
     return 1;
     }
     else return 0;
    }
    
    int isIgnoreToken(char sym){
     if(sym==newline){
     reader.row++;
     reader.column=0;
     return 1;
     }
     if(sym==tabulator||sym==space){
     return 1;
     }
     else return 0;
    
    }
    
    int number(){
     int sym;
     int val=0;
    
     val= reader.actuelSym -'0';
     while(isDigit(lookAhead())){ //LookAHead
     val= 10*val +reader.actuelSym -'0';
     }
    
     return val;
    }
    
    struct Token getNextToken(){
    }
    
    void testIT(){
    }
    
    void writeToLogFile(){
    }
    
    int main() {
    
     reader.charsIn=0;
     reader.column=0;
     reader.pos=0;
     reader.row=0;
    
     lhReader.charsIn=0;
     lhReader.pos=0;
    
     printf("fh: %d\n",reader.fh);
    
     //int fhWrite= open("test.txt","rw");
     //write(fhWrite,"ddddfgd",4); 
    
     char fileN[]="scanner.c";
     //init(fileN);
     int more=1;
     reader.fh=open(fileN,'r');
     lhReader.fh=open(fileN,'r');//lookaheda
    
     printf("fh: %d\n",reader.fh);
    
     if(reader.fh==NO_BLOCKS_MORE) printf("FILE empty");
     if(reader.fh==ERROR) printf("ERROR");
    
     printf("[%d,%d]", reader.row,reader.column);
     printf("__");
     getNextSym2();
     while(more && reader.fh!=ERROR){
    
      //actuelChar=getNextSym();
      getNextSym(); 
      getNextSym2();
      //charsIn=read(fh,buffer,64);
    
      //printf("[%d,%d]", row,column);
    
      if(reader.actuelSym==FILE_END ){
      more=0;
      printf("__________________________FILE_END___________");
      }
      /*else if(isIgnoreToken(actuelSym)){
      printf("%c",actuelSym);
      }
      else if(isDigit(actuelSym)){
      //printf("%d ",number());
      printf("%c",actuelSym);
      }*/
      else if(1){
      printf("%c",reader.actuelSym);//putchar(ne);
      printf("%c",lhReader.actuelSym);//putchar(ne);
      //printf("%c",lookAhead());//putchar(ne);
      //lookAhead();
      }
      //write(buffer,charsIn);
      //printf("\n");
      //printf("in= %d\n",charsIn);
      //if(charsIn==0)more =0;
    
     } 
     close(reader.fh);
     close(lhReader.fh);
    
     return 0;
    }
    

    vielen Dank
    zippwoo



  • ähem, jo, also wenn du jetzt noch [cpp ][/cpp ] Tags (ohne die Leerzeichen) um den Code bastelst, dann liest es sich vllt. einer durch...

    MfG

    GPC



  • Kannst du das Problem mal etwas eingrenzen? Tritt es noch auf, wenn du die Datei nur öffnest und wieder schließt?

    PS: Bitte pack deinen Quelltext in cpp-Tags, das erleichtert anderen die Fehlersuche etwas.



  • danke erstmal für die schnelle antwort
    hatte gestern schon einige male diesen fehler, da kam der fehler wenn ich nur eine kleinigkeit im code änderte, zB: irgendwo ein printf("bla"); hinzugefügte, was ja schon eigenartig ist.
    doch jetzt tritt der fehler immer auf, wenn das file geöffnet und gelesen wird.


Anmelden zum Antworten