2015-02-24 62 views
1

這個想法是,主要打開幾個文件,並給它們寫入一個條件,fp通過ref在這裏和那裏傳遞,writeresult負責保存在實際的文件中。 我們可以知道它在寫什麼文件嗎?如何知道哪個文件是一個被引用的fp正在寫入?

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

void Write2File(char *iMessage, FILE *fp) 
{ 
    fprintf(fp, "%s\n", iMessage); 

    // can i know in here where it is printing ? 
} 

int main(int argc, const char * argv[]) 
{ 
    FILE *fp1, *fp2, *fp3, *fp4; 
    char message[250]; 

    memset(message, '\0', 250); 

    strncpy(message, "sample text", 10); 

    fp1 = fopen("./output1.txt", "w+"); 
    fp2 = fopen("./output2.txt", "w+"); 
    fp3 = fopen("./output3.txt", "w+"); 
    fp4 = fopen("./output4.txt", "w+"); 

    Write2File(message, fp1); 
    Write2File(message, fp2); 
    Write2File(message, fp3); 
    Write2File(message, fp4); 

    fclose(fp1); 
    fclose(fp2); 
    fclose(fp3); 
    fclose(fp4); 

    return 0; 
} 

回答

1

這是操作系統特定的,沒有標準的方式。如果你想一直做它,你可以定義一些數據結構,將舉行沿着文件句柄的路徑名,並傳遞的周圍,而不是純文本文件:

struct file_handle { 
    FILE *fs; 
    char *path; 
}; 

通常情況下,有一個文件流和磁盤之間沒有直接的對應關係文件。例如,在Linux上,文件流可以與非磁盤文件(設備,套接字,管道)或磁盤文件相關聯,該文件可通過文件系統中的許多不同名稱進行訪問,或者已被刪除且不再可訪問。 另一方面,您可以使用/ proc文件系統來檢查哪些文件對應不同的文件描述符。這是vim實例編輯/ etc/hosts如何通過/ proc鏡頭看起來像:

# ls -l /proc/8932/fd 
total 0 
lrwx------. 1 root root 64 Feb 24 18:36 0 -> /dev/pts/0 
lrwx------. 1 root root 64 Feb 24 18:36 1 -> /dev/pts/0 
lrwx------. 1 root root 64 Feb 24 18:36 2 -> /dev/pts/0 
lrwx------. 1 root root 64 Feb 24 18:36 4 -> /etc/.hosts.swp 
+1

爲了記錄,我不認爲在我知道的任何操作系統(至少那些提供文件流的操作系統)中,文件流和磁盤文件之間存在直接對應關係。這並不意味着答案是錯誤的(不是),但是當我閱讀它時,它似乎暗示它是「一件Linux事情」:-) – Jcl 2015-02-24 18:02:47

+0

對。我說「在Linux上」,因爲我在例子中使用了/ dev,hardlinks和/ proc。我會澄清。 – 2015-02-24 18:12:49

+0

另外,請考慮由POSIX定義的'fmemopen',其中文件描述符可能實際上不存在。 – 2015-02-24 19:00:41

0

你沒有什麼比較反對,而且也得到來自FILE文件的標準方法。

當然,如果您真的想要調試數據,總會有特定於實現的方法來挖掘數據。

無論如何,你的子例程爲什麼要照顧?
你最好有這樣一個嚴重違反封裝的真正好理由。

+0

基本上,它是保持一個文件訪問多少次的統計寫入。 – jggjgj 2015-02-24 17:39:50

+0

在這種情況下,事情很簡單:當你打開/關閉它們時,讓你的stat收集器知道你的FILE,並在適當的時候用文件句柄調用該stat-updater。 – Deduplicator 2015-02-24 17:42:46

0

不,您不能在C. 但您可以將FILE指針作爲全局函數,並在函數Write2File()中進行比較。

FILE *fp1, *fp2, *fp3, *fp4; 
void Write2File(char *iMessage, FILE *fp) 
{ 
    if(fp==fp1) 
     printf("output1.txt\n"); 
    else if(fp==fp2) 
     printf("output2.txt\n"); 
    else if(fp==fp3) 
     printf("output3.txt\n"); 
    else if(fp==fp4) 
     printf("output4.txt\n");  

    fprintf(fp, "%s\n", iMessage); 


} 

或者你可以添加一個額外的參數,以您的Write2File()函數來知道哪些文件,它指的

void Write2File(char *iMessage, FILE *fp, int i) 
{ 
    char filename[12]; 
    char file[2]; 
    itoa(i, file, 10); 
    strcpy(filename, "output"); 
    strcat(filename,file); 
    strcat(filename,".txt"); 
    printf("--%s--", filename); 

} 

Write2File(message, fp1, 1); 
Write2File(message, fp2, 2); 
Write2File(message, fp3, 3); 
Write2File(message, fp4, 4); 
+0

這是不會工作,因爲在調用Write2File的時候我已經有一個引用的fp,它是動態調用動態fp – jggjgj 2015-02-24 17:41:06

+0

然後,您可以採取FILE指針全局,並嘗試在Write2File()比較它們。應該管用。看到我編輯的答案。 – 2015-02-24 17:45:33

相關問題