如何知道引用的 fp 当前正在写入哪个文件?
How to know in which file it is a referenced fp is currently writing in?
这个想法是,main 打开几个文件,并在给定条件下写入它们,fp 由 ref 在这里和那里传递,而 writeresult 负责保存在实际文件中。
我们能知道它正在写入哪个文件吗?
#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, '[=10=]', 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
.
获取文件的标准方法
当然,如果您确实需要,总是有特定于实现的方法来挖掘数据,用于调试等。
无论如何,你的子例程为什么要关心?
对于如此严重的封装破坏,你最好有一些非常好的理由。
不,你不能在 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);
这是OS特定的,没有标准方法。如果你想始终如一地做到这一点,你可以定义一些数据结构来保存文件句柄的路径名并将其传递而不是普通的文件:
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
这个想法是,main 打开几个文件,并在给定条件下写入它们,fp 由 ref 在这里和那里传递,而 writeresult 负责保存在实际文件中。 我们能知道它正在写入哪个文件吗?
#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, '[=10=]', 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
.
当然,如果您确实需要,总是有特定于实现的方法来挖掘数据,用于调试等。
无论如何,你的子例程为什么要关心?
对于如此严重的封装破坏,你最好有一些非常好的理由。
不,你不能在 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);
这是OS特定的,没有标准方法。如果你想始终如一地做到这一点,你可以定义一些数据结构来保存文件句柄的路径名并将其传递而不是普通的文件:
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