2015-02-24 61 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

相关问题