$cc a.c $./a.out < inpfilename I want to print inpfilename on stdout. How do I do that ? Thanks for the help in advance...
9 Réponses :
Pourquoi voulez-vous faire cela? Tout votre programme L'utilisateur peut aussi bien le faire: p> Et maintenant, vous n'avez absolument pas de nom de fichier à utiliser (sauf /dev/stdin).< a.out code> est passé de la coquille, est un descripteur de fichier ouvert, stdin.
a.out code> doit fonctionner avec des noms de fichiers, pourquoi ne pas prendre le fichier comme un argument de ligne de commande? p> p>
Seul la coque mère va savoir que. Le programme, a.out va toujours le voir comme STDIN. P>
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
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"
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. P>
Dans le cas d'un 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. P>
Fstat code> pour obtenir un numéro d'inode pour qu'il marche alors sur la hiérarchie de fichier. De même à
Trouver / -Num Code> Pour obtenir un chemin qui correspond à celui-ci. (Il pourrait y avoir plus d'un tel fichier de fichier en raison de liens.) P>
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.
Je ne pense pas que ce soit possible, car 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. P> << / code> vient de lire le contenu de
inpfilename code> à stdin. p>
un 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 fstat (0, sb) code> (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 em>) et inode de l'appareil qu'il réside. P>
ln code>) ils pourraient appartenir à plus d'un chemin em>. p>
g'day, p>
Comme indiqué dans la réponse ci-dessus Tout ce que vous voyez est le descripteur de fichier ouvert STDIN. P>
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. P>
htth p>
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);
Il convient de noter que / proc code> est uniquement disponible sur Linux