2012-10-22 90 views
1

採取這種代碼的例子什麼是iostream語句的語義,如myoutput << myinput.rdbuf()在c + +?

std::ifstream myinput("myinput.txt"); 
std::ofstream myoutput("myoutout.txt"); 
myoutput << myinput.rdbuf(); 
  1. 哪些操作的語義?
  2. C++版本是這個運營商的具體超載問題< < available in in?
  3. 是有沒有更明確的方式[使用命名的函數,而不是運營商爲了達到同樣的效果?
  4. 我怎麼能知道多少字節,其中在操作複製?
  5. 我可以限制複製的字節數量?
  6. 您可以概述如何實施運營商的這種特定超載或指向已建立的實施?
+1

「4.我怎麼知道在操作中拷貝了多少字節?」好像你對第一部分的內容有一個相當好的概念,那麼,不是嗎? – dasblinkenlight

+0

有人告訴我,它應該複製整個文件。但我沒有找到任何文檔,也沒有找到該特定運算符的規範<<,它的語義,錯誤條件等。 –

回答

3
  1. 它將整個輸入流(整個文件)複製到輸出流。
  2. 它始終在C++中可用。 std :: ifstream在<istream>中定義,而std :: ofstream在<ostream>中定義。
  3. 不,這是唯一的辦法。
  4. 使用myoutput.tellp()。
  5. 您需要使用std :: ifstream :: read手動讀取流中的數據,將數據複製到緩衝區並使用std :: ofstream :: write將數據寫入輸出流,直到您'已經複製了你想要的金額。
  6. 如果您安裝了C++編譯器,您可以查看它的實現(大部分流類都是模板,這意味着它們的實現必須位於標題中)。對於std::basic_ios::rdbuf,你可以看看在<ios>,併爲std::ostream::operator<<(std::basic_streambuf*),你可以看看在<ostream>
+0

假設文件非常大,它是否繼續從輸入文件讀取,或者它只是複製緩衝區的內容? –

+0

我稍微編輯了這個問題,使#2更清晰。 –

+0

@AviadRozenhek同樣的答案。所有的流庫都一直在C++中可用。事實上,我認爲它甚至都沒有改變,除了可能在C++的早期階段。 – user1610015