C语言 如何知道它是一个被引用的fp当前正在写入的文件?

pgky5nke  于 2023-03-28  发布在  其他
关注(0)|答案(3)|浏览(109)

这个想法是,main打开几个文件,并在给定的条件下写入它们,fp通过ref在这里和那里传递,而writerresult负责保存在实际文件中。我们能知道它正在写入哪个文件吗?

#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;
}
zour9fqk

zour9fqk1#

这是特定于操作系统的,没有标准的方法。如果你想一致地做,你可以定义一些数据结构,它将沿着FILE句柄保存路径名,并传递它而不是普通的FILE:

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

通常,文件流和磁盘文件之间没有直接的对应关系(装置、插座、pipe)或磁盘文件,这些文件可以通过文件系统中的许多不同名称进行访问,或者已被删除,不再可以访问。另一方面,您可以使用/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
wljmcqd8

wljmcqd82#

您没有任何东西可供比较,也没有从FILE获取文件的标准方法。
当然,如果你真的想,总有一些特定于实现的方法来挖掘数据,用于调试等。
无论如何,为什么要你的亚常规护理?
你最好有一些非常好的理由来解释这种严重的封装破坏。

20jt8wwn

20jt8wwn3#

不,在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);

相关问题