6
votes

En C Comment puis-je imprimer le nom de fichier de fichier redirigé comme entrée dans la coquille

$cc a.c
$./a.out < inpfilename
I want to print inpfilename on stdout.
How do I do that ?
Thanks for the help in advance...

0 commentaires

9 Réponses :


4
votes

Pourquoi voulez-vous faire cela? Tout votre programme a.out est passé de la coquille, est un descripteur de fichier ouvert, stdin.

L'utilisateur peut aussi bien le faire: xxx

Et maintenant, vous n'avez absolument pas de nom de fichier à utiliser (sauf /dev/stdin).<

a.out doit fonctionner avec des noms de fichiers, pourquoi ne pas prendre le fichier comme un argument de ligne de commande?

0 commentaires

2
votes

Seul la coque mère va savoir que. Le programme, a.out va toujours le voir comme STDIN.


0 commentaires

1
votes

Votre système d'exploitation fournira votre programme avec l'entrée de ce fichier. Ceci est transparent à votre programme et, en tant que tel, vous ne pouvez pas voir le nom du fichier. En fait, dans certaines circonstances, vous serez introduisé que ne vient pas em> provenant d'un fichier, tel que celui-ci:

ls | ./a.out


0 commentaires

0
votes

Lorsque vous le mettez le processus qui gère A.out n'a aucune notion de nom de fichier du fichier qui fournit son «entrée standard».

L'invocation doit être: P>

$ ./a.out <<< "inputfilename"


0 commentaires

10
votes

Vous ne pouvez pas obtenir le nom de fichier exactement comme une entrée; La coquille gérera toutes les choses de redirection sans vous le dire.

Dans le cas d'un Redirection, vous pouvez récupérer un fichier FilePath associé à STDIN à l'aide de Fstat pour obtenir un numéro d'inode pour qu'il marche alors sur la hiérarchie de fichier. De même à Trouver / -Num Pour obtenir un chemin qui correspond à celui-ci. (Il pourrait y avoir plus d'un tel fichier de fichier en raison de liens.)

Mais vous n'auriez pas besoin de le faire. Comme d'autres l'ont dit, si vous devez connaître des noms de fichiers, vous devez prendre des noms de fichiers comme des arguments.


2 commentaires

Le «récupération d'une filière» est susceptible d'être souvent chers - doublement, donc si vous avez une pléthore de systèmes de fichiers montés NFS pour numériser. En outre, comme indiqué, cela peut ne pas vous donner une réponse; Les connexions de tuyaux, par exemple, n'ont tout simplement pas de nom dans le système de fichiers.


Oui en effet. C'est une perte de tout tour.



0
votes

Je ne pense pas que ce soit possible, car << / code> vient de lire le contenu de inpfilename à stdin.

Si vous souhaitez que InpLeName soit disponible pour votre programme, mais vous souhaitez également pouvoir accepter les données de STDIN, configurez votre programme pour accepter un argument de nom de fichier et fopen que dans un fichier. Si aucun argument n'est donné Attribuer STDIN à votre dossier. Ensuite, votre routine de lecture d'entrée utilise des fonctions telles que FSCANF plutôt que Scanf, et le fichier que vous transmettez est un lien vers le fichier fopé ou stdin.


0 commentaires

0
votes

un fstat (0, sb) (0 est le descripteur de fichier STDIN) vous donnera des informations détaillées sur le fichier d'entrée, la taille, les autorisations (appelées mode ) et inode de l'appareil qu'il réside.

Quoi qu'il en soit, vous ne pourrez pas dire son chemin: comme Unix inodes n'a aucune idée de quel chemin ils appartiennent et techniquement (voir ln ) ils pourraient appartenir à plus d'un chemin .


0 commentaires

0
votes

g'day,

Comme indiqué dans la réponse ci-dessus Tout ce que vous voyez est le descripteur de fichier ouvert STDIN.

Si vous voulez vraiment faire cela, vous pouvez spécifier que la première ligne du fichier d'entrée doit être le nom du fichier lui-même.

htth


0 commentaires

2
votes

En fait, il est possible d'obtenir le nom de fichier de PROCFS, car / proc / * / fd contient Symlink aux fichiers ouverts:

char filename[bufsize];
int sz = readlink("/proc/self/fd/0", filename, bufsize-1);
filename[sz] = 0;
puts(filename);


1 commentaires

Il convient de noter que / proc est uniquement disponible sur Linux