2011-12-27 31 views
1

我已經得到了這段代碼,最後在我的命令行上使用了一個參數,也就是說它的一個文件可以使用,儘管我設計的代碼具有它的工作原理與無限數量的文件。它所做的是將一些X字符的文本文件(包含用空格分隔的單詞)替換爲\n,從而創建一個單詞列表。雖然它成功完成了第一個參數,但它只是忽略了第二個參數。C - 使用fopen,fclose,fputc等

另一個小問題似乎是它最後還會打印出一些垃圾信,一個Y上面有兩個點;我假設一些EOF符號,但我似乎無法阻止這種情況發生!

int main(int argc, char** argv) { 
    FILE *fpIn, *fpOut; 
    int i, j; 
    j = 1; 
    char c; 
    char myString[256]; 

    printf("%d", argc); 
    printf("\n"); 
    printf("The following arguments were passed to main(): "); 
       for(i=1; i<argc; i++) printf("%s ", argv[i]); 
    printf("\n"); 

    while(argc--) { 
     for(i = 1; i < argc; i++) { 
      fpIn = fopen(argv[j], "rb"); 
      snprintf(myString, 256, "%s~[%d]", argv[j], i); 
      fpOut= fopen(myString, "wb"); 
      while (c != EOF) { 
       c = fgetc(fpIn); 
       if (isspace(c)) 
        c = '\n'; 
       fputc(c, fpOut); 
      } 
      j++; 
     } 
    } 
    return 0; 
} 
+0

[使用文本文件二](http://stackoverflow.com/questions/8649068/working-with-text-files-two)的可能的重複。你在這個問題上接受的答案解釋了你爲什麼會得到額外的垃圾角色。你的代碼在這個問題上繼續是不正確的。 – 2011-12-27 23:56:52

+0

是的,這是我以前的帖子,雖然我已經取得了一些進展,但通常不會在舊帖子上得到回覆,所以我想我可以做出另一個:) – PnP 2011-12-27 23:57:55

+0

我真的不明白爲什麼,如果我誠實 – PnP 2011-12-27 23:58:37

回答

4

getchar()getc()fgetc()函數(或宏)返回一個int,而不是一個char

您必須使用:

int c; 

while ((c = fgetc(fpIn)) != EOF) 
{ 
    if (isspace(c)) 
     c = '\n'; 
    fputc(c, fpOut); 
} 

想想看;該功能必須能夠返回任何有效的char EOF(這是任何有效的char值是不同的。因此,根據定義,返回值不能是char ...

如果你使用會發生什麼char

  • 之前,測試它(這樣的循環可能早破)您的原始代碼沒有初始化c
  • 你的代碼沒有讀取EOF後立即測試c(所以它可能會打印垃圾字符,經常LA,帶有DIAERESIS的LATIN小字母Y,U + 00FF)。
  • 如果您的char類型是無符號的,您永遠不會看到EOF。
  • 如果您的char類型已簽名,則某些有效字符(通常是ÿ再次)會被誤解爲EOF。

我似乎仍不能得到它的工作對多個參數雖然。

有你運行雙迴路問題:

int i, j; 
j = 1; 

while (argc--) 
{ 
    for (i = 1; i < argc; i++) 
    { 
     fpIn = fopen(argv[j], "rb"); 
     ...process fpIn... 
     j++; 
    } 
} 

讓我們假設你調用與兩個文件名的命令;然後argc == 3

第一次過while循環後,argc == 2。然後,您執行for循環,其中i取值1;你打開argv[1](因爲j == 1)。您處理該文件;然後將j增量爲2,之後還將i也遞增爲2.第二次圍繞for循環,i == 2和argc一樣,因此for循環終止。 while循環再次將argc減1,但測試2 != 0。但是,for循環設置爲i = 1,然後終止,因爲i == argcwhile循環遞減argc爲1,並重復。

您可以使用while循環或for循環,但不需要這兩個循環。

所以,要麼:

for (i = i; i < argc; i++) 
{ 
    ...process argv[i]... 
} 

或者:

while (--argc > 0) 
{ 
    ...process *++argv... 
} 

我會使用for循環。

+0

謝謝,我添加了一個檢查來查看它是否是我當前循環中的EOF,如果(C == EOF){break;}修復它! – PnP 2011-12-28 00:15:26

+0

我仍然無法讓它爲多個參數工作,雖然:/ – PnP 2011-12-28 00:20:15