2012-10-02 70 views
0

我的一個朋友需要在他的一個課程中使用MATLAB,所以他打電話給我(計算機科學專業),詢問我是否可以教他C.我熟悉C++ ,所以我也熟悉了一般語法,卻不得不對IO庫C.C程序無法創建輸出文本文件

我創建了一些簡單的IO程序,以顯示我的朋友看了,但我的第三個程序是導致我麻煩。當我使用Eclipse(使用CDT)在我的機器上運行程序時,Eclipse的控制檯產生一個錯誤的輸出,而不是提示我輸入數據,它會得到輸入,然後使用FAILURE一次打印所有數據。

程序應該從用戶那裏得到一個文件名,創建該文件,直到用戶輸入一個空行寫入。

當我編譯/通過控制檯在我的機器上運行它(G ++ files2.c)提示我輸入的數據正確,但故障出現時,並沒有輸出文件。

我認爲錯誤在於我如何使用char數組,因爲使用scanf來獲取文件名將創建一個功能文件(可能因爲它忽略了空白),但不能進入while循環。

#include <stdio.h> 

#define name_length 20 
#define line_size 80 

int main() { 
    FILE * write_file;     // pointer to file you will write to 
    char filename[name_length];   // variable to hold the name of file 
    char string_buffer[line_size];  // buffer to hold your text 

    printf("Filename: ");     // prompt for filename 

    fgets(filename, name_length, stdin); // get filename from user 

    if (filename[name_length-1] == '\n') // if last char in stream is newline, 
    {filename[name_length-1] = '\0';} // remove it 

    write_file = fopen(filename, "w"); // create/overwrite file user named 

    if (!write_file) {printf("FAILURE");} // failed to create FILE * 

    // inform user how to exit 
    printf("To exit, enter a blank line (no spaces)\n"); 

    // while getting input, print to file 
    while (fgets(string_buffer, line_size, stdin) != NULL) { 
    fputs(string_buffer, write_file); 
    if (string_buffer[0] == '\n') {break;} 
    } 

    fclose(write_file); 
    return 0; 
} 

我應該如何去修復程序?我發現用戶終止的輸入寫入文件幾乎沒有。

現在,如果你能原諒我,我有幾個文件的刪除了我大學的UNIX服務器,並且因爲他們有令人費解的文件名,創建我叫不上名字指定他們...

EDIT-- ----

就像我說的,我能夠使用

scanf("%s", filename); 

獲得工作的文件名(不換行字符)。但是,無論我在while循環中使用scanf還是fgets,如果將它們與scanf一起用於文件名,我無法寫入任何文件,因爲它不會進入while循環。

我應該如何重構我的寫作文件和我的while循環?

+2

'frnn()'失敗後設置了'errno'? – Mike

+0

你有寫權限嗎?我問,因爲你說你的大學的服務器,這些類型的設置通常有嚴格的權限 –

+0

@Sithregal這可能是值得嘗試避免混合fgets和scanf。如果改變了換行檢查,以: 如果(文件名[strlen的(文件名)-1] == '\ n') {文件名[strlen的(文件名)-1] = '\ 0';} 似乎爲我工作,但你也寫了文件的最後一行,空行。你可能會更好地使用一個do ... while循環而不是一個while循環,這是我的經驗中一個非常不充分的結構:-) – cosimo193

回答

1

這些行似乎是不正確的:

if (filename[name_length-1] == '\n') // if last char in stream is newline, 
    {filename[name_length-1] = '\0';} // remove it 

您驗證name_length - 1個字,,這是你的情況沒有19所引入的文件名長度的任何方面。所以如果你的文件名長度小於18,你不會在字符串末尾替換'\ n'字符。顯然文件名不能包含'\ n'字符。

您需要先以strlen()作爲示例獲取文件名的大小。

if (filename[strlen(filename) - 1] == '\n') 
{ 
    filename[strlen(filename) - 1] = '\0'; 
} 

(不要忘了包括string.h頭)

我希望我能夠幫助我弱的英語。

3

您檢查換行符是否有誤;您正在查看文件名中的最後一個字符,但如果用戶輸入的文件名比最大值短,則可能會在此之前。然後,您試圖打開一個名稱中帶有換行符的文件。