2013-08-23 45 views
2

我有一個矢量vec(256,0),我用它來記錄輸入文件中字符的類型和頻率。所以給定3 A的我的vec [65]將保持3的值。我正在嘗試向輸出文件寫入總計的非空字符,然後是ASCII字符和出現頻率。如何從數組寫入輸出文件?

int count = 0; 
for (int i = 0; i < 256; i++) 
    if (vec[i] != 0) // if not 0 count it 
    count++; 

// print the count as the first char in output file 
outfile << count; 

for (int i = 0; i < 256; i++) 
    if (vec[i] != 0) 
    outfile << (char) i << vec[i]; 

給定輸入 「A BB C」 我要的是:

4a1b2c1

但我得到的是:

1 2a1b2c1

什麼我能解決這個問題嗎?

+1

我會開始正確地初始化你的for循環,而不是使用* indeterminate *值。這:'for(int i; i <256; i ++)'*錯*。 – WhozCraig

+0

謝謝,那是一個錯字。 – Napalidon

+0

你可能會發現'std :: accumulate()'和'std :: isalnum()'同樣有幫助。 – WhozCraig

回答

0

輸入文件看起來是這樣的:「一個BBÇ\ r \ n」,而不是「一個BB C」。這意味着你有五種字符類型:'\ n'(ASCII碼:10),'\ r'(ASCII碼:13),兩個空格(ASCII碼:32),一個'a',兩個'b' '字符和一個'c'。所以你的代碼工作正常!問題是,當你在輸出文件中打印'\ r','\ n'和''時,它們將顯示爲空格。

如果您從輸入文件中刪除換行符以獲得「a bb c」作爲輸入,則輸出將爲:「4 1a1b2c1」,因爲空格的ASCII代碼小於'a 」。

+1

謝謝,我輸錯它應該如您所說 – Napalidon

+0

不幸的是不是 – Napalidon

+0

糾正錯字後輸出是否改變?如果是,請更新您的問題! – kol

0

我假設你輸入了一個換行符和兩個空格字符。然後,在五個字符總數之後,您將得到打印的換行符,然後顯示它的次數,然後是空格字符,然後是兩個字符,然後是其他字符。

編輯

我知道你不希望包括換行和空格字符和類似的控制字符到您的計數。那麼當你填充你的矢量時,你將不得不排除它們。假設你的均流字符是在一個名爲c一個char變量,那麼您需要使用類似

if(c > ' ') { 
    /* do the stuff of increasing the count for c as you do it currently */ 
} 
+0

OK我嘗試了輸入:「abbc」,仍然得到:4跳過2行然後1a1b2c1,但我想打印它4a1b2c1 – Napalidon

+0

您能顯示輸入以及如何閱讀它嗎? – FrankPl

+0

輸入「abba」我使用ifile.open(fileName,ios :: binary)讀取它 – Napalidon

0

使用這段代碼:

int count = 0; 
for (int i = 0; i < 256; i++) 
    if (i != 32 && i != 10 && i != 13) // don't count ' ' (spaces) and other stuff 
    count += vec[i]; //(not all vec[i] values are 1, 98 for instance is 2 (bb)) 

cout << count; 

for (int i = 0; i < 256; i++) 
if (i != 32 && i != 10 && i != 13 && vec[i] != 0) 
    cout << (char) i << vec[i]; 
+0

謝謝,感謝:) – Napalidon

0

我建議使用地圖來存儲計數。

看到它Live on Coliru

#include <map> 
#include <iostream> 

std::map<char, size_t> histogram(std::string const& input) 
{ 
    std::map<char, size_t> freq; 
    for (auto ch : input) 
     freq[ch]++; 

    return freq; 
} 

int main() 
{ 
    std::string input = "hello world (or read this from a large file"; 

    auto frequencies = histogram(input); 

    for (auto& entry : frequencies) 
     std::cout << "'" << entry.first << "': " << entry.second << "\n"; 
} 

這將打印

' ': 8 
'(': 1 
'a': 3 
'd': 2 
'e': 4 
'f': 2 
'g': 1 
'h': 2 
'i': 2 
'l': 5 
'm': 1 
'o': 4 
'r': 5 
's': 1 
't': 1 
'w': 1 

哦,和unprintables,

std::cout << "char: 0x" << std::setw(2) << std::ios::hex << entry.first; 

將是很好得到0x07爲ASCII 7等

+0

謝謝,好主意。 – Napalidon