2015-02-24 2 views
1

Идея состоит в том, что в основном открывается несколько файлов и записывается в них с условием, 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, '\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

Это OS специфичны и нет стандартного способа. Если вы хотите сделать это последовательно Вы можете определить некоторую структуру данных, которая будет содержать путь вдоль Дескриптора файла и передать, что вокруг вместо обычного FILE:

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

Обычно, нет прямого соответствия между потоком файлов и диском файл. Например, в Linux поток файлов может быть связан с чем-то, что не является файлом диска (устройством, сокетом, трубой) или файлом диска, доступным через множество разных имен в файловой системе, или был удален и больше не доступен , С другой стороны, вы можете использовать файловую систему/proc, чтобы проверить, какие файлы соответствуют различным файловым дескрипторам. Вот как редактируется экземпляр экземпляра vim/etc/hosts:

# 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

+0

Справа. Я сказал «на Linux», потому что в примере использовал/dev, hardlinks и/proc. Я уточню. –

+0

Кроме того, рассмотрите 'fmemopen', который определяется POSIX, где файловый дескриптор, возможно, не существует. –

0

У вас нет ничего, чтобы сравнить против, и нет никакого стандартного способа, чтобы получить файл из FILE.

Конечно, всегда есть способы реализации данных, которые вы можете выполнить, если хотите, для отладки и т. Д.

В любом случае, почему ваша подпрограмма должна заботиться?
У вас есть действительно хорошая причина такого серьезного нарушения инкапсуляции.

+0

В основном, он должен сохранять статистику за сколько раз доступ к файлу для записи. – jggjgj

+0

В этом случае все просто: сделайте свой сборщик статистики осведомленным о вашем 'FILE', когда вы его открываете/закрываете, и вызывайте этот файл обновления с помощью дескриптора файла, где это необходимо. – Deduplicator

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

+0

Тогда вы можете взять указатели FILE global и попробовать сравнить их в Write2File(). Должно сработать. См. Мой отредактированный ответ. –

Смежные вопросы