2012-01-14 24 views
0

我想將每個字節放入一個字符數組中,並重寫該文本文件以除去前100,000個字符。打開超過5 MB的文件並將它們存儲在一個數組中

int fs=0; 
    ifstream nm,nm1; 

    nm1.open("C:\\Dev-Cpp\\DCS\\Decom\\a.txt"); 

    if(nm1.is_open()) 
    { 
     nm1.seekg(0, ios::end); 
     fs = nm1.tellg(); 

    } 
    nm1.close(); 


    char ss[500000]; 

    nm.open("C:\\Dev-Cpp\\DCS\\Decom\\a.txt"); 
    nm.read(ss,fs-1); 
    nm.close(); 

    ofstream om; 
    om.open("C:\\Dev-Cpp\\DCS\\Decom\\a.txt"); 
    for(int i=100000;i<fs-1;i++){ 
      om >> ss[i]; 
      } 
    om.close(); 

問題是我無法將字符數組設置爲500萬大小。我試着用向量也

vector <char> ss (5000000); 
    int w=0; 

    ifstream in2("C:\\Dev-Cpp\\DCS\\Decom\\a.txt", ios::binary); 
    unsigned char c2; 
    while(in2.read((char *)&c2, 1)) 
    {  
    in2 >> ss[w]; 
    w++; 
    } 

在這裏W的大小几乎是FS的一半,和很多人物的缺失。

怎麼辦?

回答

2

在大多數實現中,char ss[5000000]嘗試在堆棧上進行分配,並且與整體內存大小相比,堆棧的大小是有限的。你可以經常在堆中分配較大的陣列比在棧上,像這樣:

char *ss = new char [5000000]; 
// Use ss as usual 
delete[] ss; // Do not forget to delete 

注意,如果文件大小fs大於500萬時,你會寫了緩衝區的結尾。您應該限制數據的閱讀量:

nm.read(ss,min(5000000,fs-1)); 
+0

謝謝,我用過char * ss = new char [5000000];如你所建議並刪除[] ss;在程序結束時,它現在工作正常,但我沒有堆和堆棧的經驗,不知道在哪裏放置size_t代碼(在fstream裏面?) – 2012-01-14 12:13:08

+0

@GambitKing最初你只需要粗略理解[堆vs 。stack](http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap),你可以從五分鐘的閱讀中獲得。我錯了'size_t actualSize' - 請參閱我的編輯。 – dasblinkenlight 2012-01-14 12:24:03

+0

感謝您的信息 – 2012-01-14 12:30:31

1

這部分是不正確的

while(in2.read((char *)&c2, 1)) 
{ 
    in2 >> ss[w]; 
    w++; 
} 

bacause您第一次嘗試讀取一個字符爲c2和,如果成功,讀另一個字符分成ss[w]

如果你失去了大約一半的人物,我並不感到驚訝!

0

解決您的問題的最佳方法是使用標準庫的設施。這樣,你也不必關心緩衝區溢出問題。

以下代碼未經測試。

std::fstream file("C:\\Dev-Cpp\\DCS\\Decom\\a.txt", std::ios_base::in); 
if (!file) 
{ 
    std::cerr << "could not open file C:\\Dev-Cpp\\DCS\\Decom\\a.txt for reading\n"; 
    exit(1); 
} 

std::vector<char> ss; // do *not* give a size here 
ss.reserve(5000000); // *expected* size 

// if the file is too large, the capacity will automatically be extended 
std::copy(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>(), 
      std::back_inserter(ss)); 

file.close(); 
file.open("C:\\Dev-Cpp\\DCS\\Decom\\a.txt", std::ios_base::out | std::ios_base::trunc); 
if (!file) 
{ 
    std::cerr << "could not open C:\\Dev-Cpp\\DCS\\Decom\\a.txt for writing\n"; 
    exit(1); 
} 

if (ss.size() > 100000) // only if the file actually contained more than 100000 characters 
    std::copy(ss.begin()+100000, ss.end(), std::ostreambuf_iterator<char>(file)); 

file.close(); 
相關問題