c-如何知道它是引用fp当前正在写入的文件



其想法是,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);

相关内容

  • 没有找到相关文章

最新更新