2014-03-19 30 views
1

我讀輸入文件和我有關於閱讀每一行它的併發症。我的輸入文件有兩種類型的記錄。一個有52個字符,而另一個有926個。我不知道如何處理我的fread函數,以便它可以處理這兩個記錄。誰能幫我嗎?感謝文件閱讀C.併發症用fread功能

#define LINESZ 927  /* one extra byte for new line */ 
int num;    /* integer for line number */ 
char buffer[LINESZ]; /* buffer for file read line */ 

int main() 
{ 
    FILE *ifp, *ofp; 

    ifp = fopen("dd:INPUTF", "r"); 
    ofp = fopen("dd:OUTPUTF", "w"); 

    while (!feof(ifp)) { 
     if (num = (fread(buffer, sizeof(char), LINESZ, ifp))) { 
      if (buffer[22] == 'O') { 
       printf("ravroot, %c\n", buffer[22]); 
       printf("%s*\n", buffer); 
      } 
      else if (buffer[22] == 'A') { 
       printf("ravrate, %c\n", buffer[22]); 
       printf("%s*\n", buffer); 
      } 
     } 
    } 

    fclose(ifp); 
    fclose(ofp); 
    return(0); 
} 
+1

您需要在文件中添加記錄長度。 – Rohan

+0

請發佈代碼和您看到的錯誤 – MoMo

+0

我將我的代碼調整爲讀取927個字符來處理兩者。但每次它讀取具有52個字符的記錄時,它會從旁邊的記錄中獲取字符,直到它滿足926的長度。 – entendezEJ

回答

1

當從文件中讀取行,你應該使用fgets功能。但請注意,fgets會將換行符寫入緩衝區,因此您需要去除換行符。生成的代碼如下所示

#define LINESZ 1024 /* lots of extra bytes, memory is cheap */ 
char buffer[LINESZ]; /* buffer for file read line */ 

int main(void) 
{ 
    int length; 
    FILE *ifp, *ofp; 

    ifp = fopen("dd:INPUTF", "r"); 
    ofp = fopen("dd:OUTPUTF","w"); 

    while(fgets(buffer, LINESZ, ifp) != NULL) 
    { 
     // remove the newline character, if any 
     length = strlen(buffer); 
     if (length > 0 && buffer[length-1] == '\n') 
      buffer[--length] = '\0';      

     if (length > 22) 
     { 
      if(buffer[22] == 'O') 
      { 
       printf("ravroot, %c\n", buffer[22]); 
       printf("%s*\n", buffer); 
      } 
      else if(buffer[22] == 'A') 
      { 
       printf("ravrate, %c\n", buffer[22]); 
       printf("%s*\n", buffer); 
      } 
     } 
    } 
    fclose(ifp); 
    fclose(ofp); 
    return(0);  
} 
+0

+1;但除非你知道你至少讀了23個字符(這也是OP代碼中的一個問題),否則你不應該看看'buffer [22]'。 – pat

+0

謝謝@ user3386109。 fgets命中。終於得到了我想要的輸出。 :D – entendezEJ

+0

@pat好點。我有計算的長度,應該檢查。 – user3386109

0

如果每個記錄是在單獨的線thne使用與fgets函數遇到換行符時將停止,如:

while(fgets(buf,LINESZ,ifp) != NULL) 
{ 
    //you can put your code here 
} 
+0

Hi @M Thotager。我修改了我的代碼,它是行得通的!但是當我寫緩衝區時,它只寫第一條記錄。但是printf運行良好。你知道爲什麼嗎? – entendezEJ

+0

你可以把完整的代碼..其中有fwrite –