2013-02-06 98 views
-1

我想在我之前編寫的程序中讀取兩個文件,但它總是失敗。C fopen()和fgets()問題

char line[BUFSIZ]; 
FILE *fp2=freopen("source.dat","r"); 

if(fp2==NULL) 
printf("Problm opening: source.dat"); 

FILE *fp3=freopen("result.dat", "r"); 

if(fp3==NULL) 
printf("Problm opening: result.dat"); 
char line2[BUFSIZ]; 
int len; 

while((fgets(line2, BUFSIZ, fp2) != NULL) && (fgets(line, BUFSIZ, fp3) != NULL)) { 
len=strlen(line); 
if(line[len - 1] == '\n') line[len-1] = '\0'; len=strlen(line2); 
if(line2[len - 1] == '\n') line2[len-1] = '\0'; 

rename(line, line2); 
} 

我不知道爲什麼,我知道我的程序寫入了我想打開的兩個文件。它只是沒有通過while循環。

+2

首先,你應該實際做一些事情 - 比如'exit()' - 如果你看到打開這些文件失敗。 – Reinderien

+0

你確定這兩個文件存在並且不是空的,或者其他一些情況會導致'fgets'之一返回NULL? – LSerni

+0

我通過gdb運行並且文件在循環運行之前處於目錄 – jg943

回答

0

freopen接受3個參數即,文件名模式和FILE流對象。因此,要重新打開文件,它應該已經打開。如果我們調用freopen作爲第一個調用,那麼運行時可能會拋出未初始化訪問的異常。

修改代碼如下

fp2 = fopen("source.dat", "r"); 
    fp3 = fopen("result.dat", "r"); 

我能夠沒有任何問題和控制運行的代碼會繼續超出while循環。存儲在第一個文件中的文件被重命名爲存儲在第二個文件中的名稱,我認爲這是您程序的目標。

0

此代碼適用於我,顯然應該做同樣的事情,除非註明。

的第一個音符顯然是正確的:-)

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(void) 
{ 
     char line[2][BUFSIZ]; 
     FILE *fp[2]; 
     char *file[2] = { "source.dat", "result.dat" }; 
     int f, finished = 0; 

     // Any pointers to source and result must be flushed and closed at this point, 
     // i.e. if this same program has created the files, it must now close them. 

     for (f = 0; f < 2; f++) 
     { 
      if (NULL == (fp[f] = fopen(file[f],"r"))) 
      { 
       fprintf(stderr, "Error opening %s\n", file[f]); 
       exit(-1); 
      } 
     } 

     while(!finished) 
     { 
      int len; 
      for (f = 0; f < 2 && (!finished); f++) 
      { 
       if (NULL == fgets(line[f], BUFSIZ, fp[f])) 
       { 
        fprintf(stderr, "NULL on %s\n", file[f]); 
        finished = 1; 
        break; 
       } 
       if (feof(fp[f])) 
       { 
        fprintf(stderr, "end of %s\n", file[f]); 
        finished = 1; 
        break; 
       } 
       len = strlen(line[f]); 

       // if one of the file contains an empty line, program might crash 
       if (0 == len) 
       { 
        fprintf(stderr, "empty line in %s\n", file[f]); 
        finished = 1; 
        break; 
       } 
       if ('\n' == line[f][len-1]) 
        line[f][len-1] = 0x0; 
      } 
      if (finished) 
       break; 
      fprintf(stderr, "Rename(%s, %s)\n", line[0], line[1]); 
      // rename(line, line2); 
     } 
     for (f = 0; f < 2; f++) 
     fclose(fp[f]); 

     return 0; 
}