Cookbook系列之Cpp:數據流與文件

問題01:如何垂直排列文本輸出,使其左對齊或右對齊

    使用標準的流操作符來設置字段的寬度和對齊方式。一個操作符就是操作在流上的函數,通過操作符<<將這些操作函數應用到流上。

  1. #include <iostream>
  2. #include <iomanip>                                                                
  3.                                                                                   
  4. using namespace std;                                                              
  5.                                                                                   
  6. int main()                                                                        
  7. {                                                                                 
  8.     ios_base::fmtflags flags = cout.flags();                                      
  9.     int width = 10;                                                               
  10.                                                                                   
  11.     cout << left                                                                  
  12.          << setw(width) << "Jim"                                                  
  13.          << setw(width) << "Tom"                                                  
  14.          << setw(width) << "Bill" << endl;                                        
  15.                                                                                   
  16.     cout << right                                                                 
  17.          << setfill('.')                                                          
  18.          << setw(width) << "Jim"                                                  
  19.          << setw(width) << "Tom"                                                  
  20.          << setw(width) << "Bill" << endl;                                        
  21.                                                                                   
  22.     return 0;                                                                     
  1. // output 
  2. Jim       Tom       Bill       
  3. .......Jim.......Tom......Bill 

問題02:如何格式化輸出浮點數

    使用<iomanip>和<ios>提供的標準操作來控制寫入流中的浮點數的格式。

  1. #include <iostream>
  2. #include <iomanip>                                                                
  3. #include <ios>                                                                    
  4.                                                                                   
  5. using namespace std;                                                              
  6.                                                                                   
  7. int main()                                                                        
  8. {                                                                                 
  9.     ios_base::fmtflags flags = cout.flags();                                      
  10.     double pi = 3.14159265;                                                       
  11.                                                                                   
  12.     cout << setprecision(5) << pi << endl;                                        
  13.                                                                                   
  14.     cout << fixed << showpos << setprecision(3) << pi << endl;                    
  15.                                                                                   
  16.     cout << scientific << noshowpos << pi << endl;                                
  17.                                                                                   
  18.     cout.flags(flags);                                                            
  19.                                                                                   
  20.     return 0;                                                                     
  1. // output 
  2. 3.1416 
  3. +3.142 
  4. 3.142e+00 

問題03:如何複製文件

    使用<fstream>中的C++文件流來把數據從一個流複製到另一個流。打開文件的方式在類ios中定義,常用的值如下:
>> ios::app:以追加的方式打開文件 
>> ios::ate:文件打開後定位到文件尾,ios:app就包含有此屬性 
>> ios::binary:以二進制方式打開文件,缺省的方式是文本方式。兩種方式的區別見前文 
>> ios::in:文件以輸入方式打開 
>> ios::out:文件以輸出方式打開 
>> ios::nocreate:不建立文件,所以文件不存在時打開失敗  
>> ios::noreplace:不覆蓋文件,所以打開文件時如果文件存在失敗 
>> ios::trunc:如果文件存在,把文件長度設爲0 

  1. #include <fstream> 
  2.  
  3. using namespace std; 
  4.  
  5. int main() 
  6.     fstream in("/root/.bashrc", ios::binary | ios::in); 
  7.     fstream out("/tmp/bashrc", ios::binary | ios::out); 
  8.  
  9.     out << in.rdbuf(); 
  10.  
  11.     in.close(); 
  12.     out.close(); 
  13.  
  14.     return 0; 

問題04:如何刪除或重命名文件,並且這些操作是可移植的

    使用定義在<cstdio>中的標準C函數remove和rename。如果操作失敗,函數將返回非零值,並設置errno。你可以使用strerror來將錯誤信息輸出到cerr流中。

問題05:如何創建臨時文件

    有兩種辦法可以用來創建一個臨時文件。聲明在<cstdio>中的tmpfile函數不帶任何參數,並且成功後返回一個FILE*指針,不成功返回一個NULL。你可以使用C的輸入輸出函數fread、fwrite、fgets、fputs等來操作它。tmpfile使用"wb+"的方式打開文件,並在程序退出後,自動刪除該文件。

    如果你需要一個具名的臨時文件,那麼tmpnam可以滿足你的要求。tmpnam事實上不會產生一個臨時文件,它只是創建一個唯一的文件名,你可以用這個文件名來打開一個文件。tmpnam帶一個char*類型的參數並返回一個char*類型的值。你可以使用一個指向一個字符緩存的指針來傳遞它,但必須至少有L_tmpnam內存,tmpnam將複製這個臨時的名字,並且返回一個指向這個緩存的指針。如果你傳遞一個NULL值的話,tmpfile將返回一個指向一個包含文件名的靜態緩存指針,也就意味着隨後的tmpnam調用將會改寫它。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章