2009-11-14 15 views

Odpowiedz

11

Nie można uzyskać nazwy pliku dokładnie tak jak wejście; powłoka zajmie się wszystkim tym przekierowaniem bez informowania cię.

W przypadku bezpośredniego < file przekierowania, można pobrać filepath związanego z stdin przy użyciu fstat aby uzyskać numer węzła bo potem idąc hierarchii plików podobnie do find/-inum uzyskać ścieżkę, która to odpowiada. (Może być więcej niż jeden taki plik z powodu linków.)

Ale nigdy nie powinieneś tego robić. Jak powiedzieli inni, jeśli potrzebujesz znać nazwy plików, powinieneś używać nazw plików jako argumentów.

+3

do „pobrać filepath” operacja może być piekielnie drogie - podwójnie, więc jeśli masz mnóstwo NFS zamontowanych systemów plików do skanowania. Ponadto, jak wskazano, może nie dać odpowiedzi; Połączenia rurowe, na przykład, po prostu nie mają nazwy w systemie plików. –

+0

Tak, rzeczywiście. To przegrana przez cały czas. – bobince

4

Dlaczego chcesz to zrobić? Cały twój program a.out jest przekazywany z powłoki, jest otwartym deskryptorem pliku, stdin.

Użytkownik równie dobrze może to zrobić:

cat inpfilename | ./a.out 

a teraz nie mają żadnego pliku do użycia systemowego (oprócz/dev/stdin).

Jeśli trzeba pracować z nazwami plików, to dlaczego nie przyjąć pliku jako argument wiersza poleceń?

2

Tylko jednostka nadrzędna będzie o tym wiedzieć. Program, a.out zawsze będzie traktował to jako standardowe wejście.

1

Twój system operacyjny dostarczy Twojemu programowi dane wejściowe z tego pliku. Jest to niewidoczne dla twojego programu i jako takie nie widzisz nazwy pliku. W rzeczywistości, w pewnych okolicznościach będziesz karmione wejście które nie ma pochodzić z pliku, takie jak ten:

ls | ./a.out 

Co jesteś po to bardzo specyficzne dla danego systemu. Prawdopodobnie lepszym rozwiązaniem jest podanie nazwy pliku jako parametru. W ten sposób otrzymasz nazwę pliku i możesz go otworzyć, aby przeczytać zawartość.

0

Jak to ułożysz, proces, który uruchamia a.out, nie ma pojęcia o nazwie pliku, który zapewnia jego standardowe wejście.

Wezwanie powinno być:

$ ./a.out inputfilename 

i analizowania argv w int main(int argc, char* argv[]) { ... }

lub

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

i uzyskać nazwę pliku ze standardowego wejścia.

Następnie w a.c musisz fopen ten plik, aby przeczytać jego zawartość.

0

Nie sądzę, że to możliwe, ponieważ < po prostu czyta zawartość inpfilename do STDIN.

Jeśli chcesz, aby nazwa pliku inpfilename była dostępna dla twojego programu, ale chcesz również móc przyjmować dane ze STDIN, skonfiguruj program tak, aby akceptował argument nazwy pliku i wywoływał go w PLIKU. Jeśli nie podano żadnego argumentu, przypisz STDIN do swojego PLIKU. Następnie twoja procedura odczytu wejścia wykorzystuje funkcje takie jak fscanf zamiast scanf, a PLIK, który przekazujesz jest albo łączem do pliku z napisem STDIN.

0

fstat(0,sb) (0 stdin jest deskryptor pliku) daje szczegółowe informacje na temat pliku wejściowego, rozmiar, uprawnienia (zwane tryb) i-węzeł urządzenia ona znajduje.

każdym razie nie będzie w stanie powiedzieć jej drogę: jak węzły UNIX nie mają pojęcia, co ścieżka do której należą, i technicznie (patrz ln) mogą one należeć do więcej niż jedną ścieżkę.

0

G'day,

Jak wskazano w powyższej odpowiedzi Wszystko co widzisz jest otwarty deskryptor stdin.

Jeśli naprawdę chcesz to zrobić, możesz określić, że pierwszy wiersz pliku wejściowego musi być nazwą samego pliku.

HTH

Powiązane problemy