2013-09-01 47 views
0

我有一個文本文件,並希望在字節範圍4030來改變它在某些地方,例如4060更改一個文本文件,以這樣的方式在隨機存取

  • 如果有一個字符「C '或'c'後面加'G'或'g',必須改爲'B'

輸入文件是一個文本文件,我想要一個文本輸出文件。在文本文件中沒有隨機訪問,因此我必須以二進制格式打開文件並進行更改,但輸出文件將是二進制文件,我不知道如何獲取文本輸出。代碼如下:

int main() 
{ 
    string str, cstr; 
    ReadTextFile("in", 4030, 4060); 
    return 0; 
} 

string ReadTextFile(string path, int from, int to) 
{ 
    fstream fp(path.c_str(), ios::in|ios::out|ios::binary); 
    char *target; 
    string res, str; 
    target = new char[to - from + 1]; 
    if (!target) 
    { 
     cout << "Cannot allocate memory." << endl; 
     return ""; 
    } 
    fp.seekg(from); 
    fp.read(target, to - from); 
    target[to - from] = 0; 
    res = target; 
    str = changestring(res); 
    fp.seekg(from); 
    fp.write((char *)&str, to-from); 
    return res; 
} 

string changestring(string str) 
{ 
    int l = str.length(); 
    l = l-1; 
    for (int i = 0; i <= l; i++) 
    { 
     if (str[i] == 'C' || str[i] == 'c') 
     { 
      int j = i+1; 
      if (str[j] == 'G' || str[j] == 'g') 
       str[i] = 'B'; 
     } 
    } 
    return str; 
} 
+0

這不是全部代碼。我假設有一些原型可用於'main()'後面的函數,否則這些原本都不會編譯。 – WhozCraig

+0

在Unix上,二進制文件和文本文件之間沒有區別,您可以打開它並使其運行。如果您在其他系統上並且將文件作爲「文本」文件打開,那麼CRLF將在輸入時映射到NL並在輸出時再次映射,這意味着您不必擔心字節範圍的含義。 –

+2

CG是否被映射到BG?或者是CG映射到B?有一個巨大的差異,因爲第一個是長度保留,但第二個不是。 –

回答

0

您誤解了文本和二進制文件。如果你以二進制模式打開一個文件,那麼輸出結果將是二進制的。在Windows系統中,所有二進制模式實際上都會停止轉換爲\ r \ n。換句話說,它影響文本文件中的行結束符,沒有別的。

由於您正在將字符串內部的指針寫入輸出,因此將字符寫入文件,而不是將字符寫入文件,因此您的輸出中會出現二進制文件。

變化

fp.write((char *)&str, to-from); 

fp.write(str.c_str(), to-from); 

這也將工作

fp << str; 

要獲得文本輸出,寫入文本。無論您是使用write還是使用<<,文本都只是文本。根據輸出,二進制和文本兩種模式停止思考,這是不準確的,其你寫什麼而不是如何你寫它決定輸出是文本還是二進制。