2014-01-26 40 views
-1

編輯:我在一個嚴格的C語言環境中。任何C++代碼都不行。我處於無法調試的環境中。我只是能夠編譯和刪除所有錯誤的程序。對不起,如果我看起來很嚴格,那只是我在這樣的環境下工作。任何幫助感謝!將字符串指針傳遞給fopen時出錯

我有一個叫做namefi.txt的文件,它的所有文件名都是一行一行。每行只有一個文件名,所以我使用strtok刪除所有空格,並將文件名傳給FOPEN。但似乎f-open並沒有採取。它創建output.txt文件,甚至將其重命名爲所需的名稱(儘管直到name_ne.txt - 不知道爲什麼'w'丟失,'name'只有四個字符長,但仍然很好),但是當我打開文件,我看到的只是「文件打開錯誤Naren.txt」。如果我註釋掉程序的名稱部分和重命名部分,它會從輸入文件寫出輸出文件。這只是它從namefi.txt獲取文件名並打開它的部分沒有發生。任何幫助,將不勝感激。這是我的代碼。

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
void main() 
{ 
    FILE *inpfi, *outfi, *namefi,newna; 
    char buf[132], name[132], *trim; 
    namefi = fopen("Namefi.txt", "r"); 
    while(frets(name, 132, namefi)!=NULL) 
    { 
     trim = strtok(name," "); 
     inpfi = fopen(trim, "r"); 
     outfi = fopen("OUTPUT.txt", "w"); 
     if(!inpfi) 
      fprintf(outfi, "File open error: %s", trim); 
     while(fgets(but,132,inpfi)!=NULL) 
      fprint(outfi, "%s", buf); 
     newna = strtok(trim, "."); 
     newna = strcat(newna,"_new.txt"); 
     rename("OUTPUT.TXT", newna); 
     fclose(inpfi); 
     fclose(outfi); 
    } 
} 
+2

編譯所有警告和調試信息(可能用'gcc -Wall -g')。 **使用調試器**(如'gdb')。測試所有對libc函數的調用(例如'fopen')。使用'perror'來顯示錯誤代碼。告訴我們您的編譯器,操作系統,文件系統....'frets'應該是'fgets';還請縮進您的代碼以使其更具可讀性。 –

+0

@BasileStarynkevitch感謝您的評論。我編輯了這個問題。關於縮進,我確實給了ctrl + k。不知道爲什麼它不起作用。 :(對不起。 –

+0

只需輸入適當數量的空格來縮進代碼。在Linux系統上,您還可以使用:'indent source.c';然後'sed's/^//'source.c' - 這裏有在第二個和第三個'/'之間有四個空格 - 並複製粘貼'sed'命令的輸出.... –

回答

1
  1. FILE *inpfi, *outfi, *namefi,newna; 
    

    newna缺少*

  2. while(frets(name, 132, namefi)!=NULL) 
    

    frets應該fgets

  3. trim = strtok(name," "); 
    inpfi = fopen(trim, "r"); 
    

    你在太空中第一次出現啓動文件名,我懷疑這意。

  4. outfi = fopen("OUTPUT.txt", "w"); 
    

    在每次循環迭代中覆蓋OUTPUT.txt。您可能想要使用"a"而不是"w"或在循環輸入前打開文件。

  5. while(fgets(but,132,inpfi)!=NULL) 
    

    but應該buf

  6. fprint(outfi, "%s", buf); 
    

    fprint應該fprintf

  7. newna = strtok(trim, "."); 
    

    爲什麼你現在使用newnachar*,當你宣佈它作爲FILE(或FILE*,我想這應該是)

  8. rename("OUTPUT.TXT", newna); 
    fclose(inpfi); 
    fclose(outfi); 
    

    關閉它之前,重命名文件。我不完全知道這種情況下的行爲,但我懷疑這是一個好主意。

我提到的大多數錯誤都可以通過校對,編輯器檢查或編譯器警告/錯誤輕易避免。你發佈的代碼當然不能編譯。

+0

對不起,我從前一個文件中發佈了一個錯誤,我發現了錯誤,這是因爲我留在namefi文件中的空間。作爲分隔符,我將空格改爲「」,其中'。'作爲分隔符,它起作用,你提到的這些錯誤已被糾正,但是非常感謝@nabla。 –

相關問題