2012-01-22 52 views
1

我正在爲學校編寫一個使用Xcode的程序,需要我們使用open()系統調用。我做
int input_file_desc = open(input_path, O_RDONLY);
printf("input file desc %d:\n", input_file_desc);文件是否需要在C/C++中使用open()打開的擴展名?

,並將其與-1出現。該文件的路徑是〜/ data_to_read。我在xcode中設置了命令行參數。 input_path是我從命令行獲得的const char *。出於某種原因,如果我將文件名和命令行參數更改爲〜/ data_to_read.txt,它可以正常工作。讓我知道是否需要更多信息。謝謝。

編輯:我只用.txt試過,看看是不是這個問題,但是我仍然不知道爲什麼它需要首先擴展。你可以擁有沒有擴展名的文件嗎?在這種情況下,它應該仍然有效,只要文件路徑和參數都沒有擴展名,對吧?

+2

擴展名是*名稱的一部分。文件名是「data_to_read.txt」,而不是「data_to_read」。 –

回答

2

看起來你正在使用C,爲什麼C++標籤呢?是否允許?在C++中有簡單而好的類來處理文件。

但是,您肯定需要在文件名稱(input_path)中包含擴展名,因爲具有相同名稱和不同擴展名的許多文件可以存在於同一目錄中,因此應打開哪一個?

編輯:它應該知道文件擴展名(特別是在類似於UNIX的操作系統)只是一個「幫助」的東西,它們並不是真正必要的。例如,您可以擁有一個包含C++代碼但沒有.cpp擴展名的文件,例如,其名稱爲foo只有沒有擴展名(甚至沒有像foo.bar這樣的瘋狂擴展名)。仍然可以使用g ++編譯它,因爲只要內容對使用該文件的應用程序有效,擴展就不是很重要。

+0

這是一個C++文件。我在終端用xcode和g ++試過了,都沒有工作。這就是爲什麼C++標籤。但我也認爲open()是一個c命令。因此c標籤。 – Marty

+0

很好,因爲一些奇怪的原因,當我檢查終端中的data_to_read文件時,它說它確實有.txt。不知道爲什麼。但是在我添加/刪除它之前它肯定沒有它。 – Marty

+0

你的意思是文件不存在,終端說它有?我並沒有真正進入Linux,但應該知道擴展名不是真正的「擴展名」,它是名稱的一部分,正如你已經提到的一個文件可能沒有擴展名,並且沒有問題,因爲該擴展沒有什麼「真實」。 –

1

我明白你的問題的方式,你問是否一個文件需要有一個擴展名被C打開的功能打開,對吧?答案是否定的。 C對你沒有任何魔力,並會嘗試用你指定的確切文件名打開一個文件。如果文件有擴展名,則必須在api中指定它,否則不應該。

檢查errno變量中返回的錯誤代碼(使用strerror或perror獲取人類可讀的錯誤消息)以找出錯誤。這應該指向正確的方向。

0

文件名不需要擴展名 - 文件可以被稱爲「data_to_read」。但是系統上的大部分文件名做的都有擴展名,只是Windows資源管理器隱藏了它們。要從程序中打開文件,您需要指定此擴展名。

右鍵單擊Windows資源管理器中的文件,然後選擇「屬性」以確定文件名是否具有擴展名。或者查看Windows命令提示符控制檯中的文件。

+0

呃... xcode = mac :) – Marty

1

正如其他人所說,擴展名僅僅是名稱的一部分。

你遇到的問題可能是因爲你的操作系統是windows,而微軟的人有這種愚蠢的想法,默認「隱藏」擴展名,所以你的文件似乎被命名爲「測試」,而它的名字確實是「測試」 .txt「,因爲它是用記事本創建的。

在windows系統中,通常會看到名爲「foo.txt.txt」的文件,因爲隱藏/顯示/猜測/自動添加擴展的完全愚蠢的想法根本無法正常工作。

您可以在計算機上設置首選項,以便始終顯示文件擴展名,這是Windows系統上最好的選擇。如果你對程序設計感興趣,可能會考慮更好地開發編程環境,比如對於程序員來說不那麼有敵意的Linux環境。

+0

我同意你關於愚蠢地隱藏文件擴展名的論點。但它是否適用於OP?他不在Windows上。事實上,我只是看到他告訴我們它的Mac。 – ScrollerBlaster

+0

@ScrollerBlaster:對不起,你是100%正確的......我錯過了他/他正在使用xcode。在我的Mac mini(雪豹)上,我可以看到所有的文件擴展名,即使在查找器選項中有一個「顯示所有文件擴展名」複選框,但它不會被檢查。 – 6502

+0

@ 6502是的,我也注意到了這一點,但是當你選中「顯示所有文件擴展名」時,我看到的唯一新的擴展名是.app擴展名。我假設這就是爲什麼它「顯示所有文件名擴展名」而不是「顯示文件名擴展名」。奇怪的是,它沒有找到擴展名,並在終端中顯示。但是當我從文件名中刪除了「.txt」時,我的顯示文件名擴展名關閉了,所以也許它只是隱藏它而不是刪除它? – Marty

相關問題