2012-09-22 74 views
0

試圖幫助一個朋友,我不是要求代碼。二進制/ Int文件讀取和陣列存儲

我有一個文本文件,它具有以二進制形式排序的整數。 100010101001010101010. 我該如何去讀取8個整數來創建一個字節,然後將它作爲一個int存儲,然後將其存入一個int數組中。我不能使用字符串或任何動態分配。數字在一行上。我必須通過這個計劃自己把它們分開。

我想過使用for循環來讀取每個int的指針並將它們追加到一個int,並將該int引發到數組中。類似的東西(請原諒我的解釋編碼,我有一段時間沒碰它)。

while(eof) //end of file 
{ 
    for(int i = 0, i > 9, i ++) 
    { 
    pointer read file seekg() 
    int += seekg() // minus the part where its mathematically adding im thinking of  str+= str 
    //i know its the wrong code 
    } 

x++ 
array [x] = int from for loop 
} 

對此有何看法?

+0

有關文件格式細節的一點亮點,請您提供一個更好的輸入數據示例。值分隔,全32位提供的所有int值,或者它們的長度是任意的,由空白等分隔。 – WhozCraig

回答

2

你可以使用一個循環,並且在每一次迭代中,你將會遍歷每一個數字。將第一位數字乘以​​,將第二位乘以2^6,然後像這樣繼續,直到您的8th數字(乘以2^0的倍數)。同時通過這個添加這個數字並存儲在一個向量或數組中。此外,還有一個跟蹤數字當前位置的變量。因爲在每個8數字後,您必須執行上述相同的過程,以將8 bit binary轉換爲byte

1

嗯,你已經已經突破它分解成以下步驟:

  • 讀8位在同一時間做出字節
  • 然後保存,作爲一個INT
  • 的東西,到數組indes

太棒了!我們來看看每一個。

首先,您需要一次讀取一個字符的文件。 C標準庫爲此提供了一個功能:fgetc。通過一個FILE *,它會將您讀取的數字的ASCII值或EOF(-1)返回到文件末尾。

所以,我們知道我們可以用fgetc,且無任何換行符,我們知道它會返回'1''0',或EOF。換句話說:

10001101 => successive fgetc() calls will return 
    '1', '0', '0', '0', '1', '1,' '0', '1', 'EOF' 

這聽起來像一個循環:

for (int bits = 0; bits < 8; bits++) { 
    int digit = fgetc(file); 
    if (digit == '0') { 
    // something 
    } else if (digit == '1') { 
    // something else 
    } else if (digit == EOF) { 
    // done with the file 
    } 
} 

所有權利。現在,我們如何將0和1組合成一個二進制數?答案有點改變。我們設置一個變量來保存輸出數字,然後重複設置最低位並將其他位向上移。所以:

10001101 
'1' =>  1 
'0' =>  10 
'0' =>  100 
'0' =>  1000 
'1' => 10001 
'1' => 100011 
'0' => 1000110 
'1' => 10001101 

所以:

int number = 0; 
for (int bits = 0; bits < 8; bits++) { 
    // shift number up one place 
    number = number << 1; 

    int digit = fgetc(file); 
    if (digit == '0') { 
    // do nothing; the lowest bit is 0 already 
    } else if (digit == '1') { 
    // set number's lowest bit 
    number |= 0x01; 
    } else if (digit == EOF) { 
    // done with the file 
    } 
} 

現在,所有你需要做的是包裹在另一個循環,使number在數組中。這只是記住你已經存儲了多少個數字(一個計數器),然後在你點擊文件結尾時從循環中逃脫。

1

這是一個C++示例,介紹如何以二進制形式將整數寫入文件,以及如何在同一程序中將二進制數據讀回爲整數。評論是在程序中,希望這有助於。

這假設您的機器確認數據類型爲char爲1個字節,並且int爲4個字節。

#include <fstream> 
#include <iostream> 

using namespace std; 

int main() { 

    ofstream outFile; // File which we will write binary data to. 
    ifstream inFile; // File which we will read binary data from. 

    outFile.open("intBin.txt", ios::binary); // Flag file as binary. 

    for(int i = 0; i < 20; ++i) { 
      // This writes 4 bytes out to file. 
     outFile.write(reinterpret_cast<const char*>(&i), sizeof(int)); 
    } 
    outFile.close(); // Must close, since race conditions will occur accessing same file in same process of our program. 

    inFile.open("intBin.txt", ios::binary); // Flag file as binary. 
    int binVals; 
    for(int i = 0; i < 20; ++i) { 
      // This reads 4 bytes back into the file. 
     inFile.read(reinterpret_cast<char*>(&binVals), sizeof(int)); 
     cout << binVals << endl; 
    } 
    inFile.close(); 

} 
+1

文件中的整數是文本。即讀取第一個字節及其0x31('1'的ASCII字節)。二進制讀取/寫入不是他正在處理的內容。 – WhozCraig

+0

Woops!誤解了這個問題。 – Ryan