其想法是,main打开几个文件,并在给定条件的情况下向它们写入,fp由ref到处传递,writeresult负责保存在实际文件中。我们能知道它写在哪个文件里吗?
#include <stdio.h>
#include <string.h>
void Write2File(char *iMessage, FILE *fp)
{
fprintf(fp, "%sn", 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, ' ', 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;
}
这是特定于操作系统的,没有标准的方法。如果你想始终如一地做到这一点,你可以定义一些数据结构,沿着FILE句柄保存路径名,并将其传递出去,而不是简单的FILE:
struct file_handle {
FILE *fs;
char *path;
};
通常,文件流和磁盘文件之间没有直接的对应关系。例如,在Linux上,文件流可以与非磁盘文件(设备、套接字、管道)或磁盘文件相关联,这些文件可以通过文件系统中的许多不同名称访问,或者已被删除且不再可访问。另一方面,您可以使用/proc文件系统来检查哪些文件对应于不同的文件描述符。这就是通过/proc镜头编辑/etc/hosts的vim实例的样子:
# 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
您没有任何可比较的东西,也没有标准的方法从FILE
获取文件。
当然,如果你真的想挖掘数据,为了调试等等,总有一些特定于实现的方法。
不管怎样,你为什么要进行日常护理
对于如此严重的封装破坏,您最好有一些非常好的理由。
不,你不能在C中。但是,您可以将FILE指针作为全局指针,并在函数Write2File()中进行比较。
FILE *fp1, *fp2, *fp3, *fp4;
void Write2File(char *iMessage, FILE *fp)
{
if(fp==fp1)
printf("output1.txtn");
else if(fp==fp2)
printf("output2.txtn");
else if(fp==fp3)
printf("output3.txtn");
else if(fp==fp4)
printf("output4.txtn");
fprintf(fp, "%sn", 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);