2013-08-23 2 views
2

필자는 입력 파일에서 문자 유형 및 빈도를 기록하는 데 사용하는 벡터 vec (256, 0)을 사용합니다. 따라서 3 A의 my vec [65]는 3의 값을 유지합니다. 출력 파일에 비어 있지 않은 문자가 합계로오고 아스키 문자와 발생 빈도가 뒤 따르는 문자를 출력하려고합니다.배열에서 출력 파일에 쓰는 방법은 무엇입니까?

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]; 

주어진 입력의 "BB C는"내가 원하는 것은 :

4a1b2c1

하지만 내가 얻을 것은 :

5

1 2a1b2c1

무엇 이 문제를 해결할 수 있습니까?

+1

* 불확정 * 값을 사용하는 대신 for 루프를 올바르게 초기화하는 것으로 시작하겠습니다. 이것은 : for (int i; i <256; i ++)는 * 틀린 *입니다. – WhozCraig

+0

고마워, 그건 오타 였어. – Napalidon

+0

그리고'std :: accumulate()'와'std :: isalnum() '도 똑같이 도움이 될 것입니다. 내가 입력이 아스키 테이블의 모든 256 개 문자에 대해 작업 할 때부터이 isalnum()를하지 않을 – WhozCraig

답변

0

귀하의 입력 파일 같은 것을 사용하는 것은 다음과 같습니다 대신 "BB 탄의 C"의 "n은 BB의 C \ r에 \"를. '\ n'(ASCII 코드 : 10), '\ r'(ASCII 코드 : 13), 두 개의 공백 (ASCII 코드 : 32), 'a', 두 개의 'b '문자와'c '가 있습니다. 따라서 코드가 올바르게 작동합니다! 문제는 '\ r', '\ n'및 ''을 출력 파일에 출력 할 때 공백으로 표시된다는 것입니다.

입력 파일에서 개행 문자를 제거하면 "a bb c"를 입력으로 사용하면 출력 결과는 "4 1a1b2c1"이됩니다. 공간의 ASCII 코드가 'a '.

+1

감사를 ifile.open 사용하여 읽을 수 없습니다 – Napalidon

+0

을 말했듯이 그것이 있어야 잘못 입력, 그것은 (파일 이름, IOS : 바이너리) – Napalidon

+0

오타를 수정 한 후 출력 변화를 했습니까? 그렇다면 질문을 업데이트하십시오! – kol

0

사용자가 입력 할 줄 바꿈 문자 하나와 공백 문자 2 개가 있다고 가정합니다. 그런 다음 총 문자 수에 대해 5를 입력하면 줄 바꿈이 인쇄 된 다음 나타나는 횟수와 공백 문자, 두 개 및 다른 문자가 차례로 인쇄됩니다.

편집

나는 당신이 당신의 카운트에 줄 바꿈과 공간 문자와 유사한 제어 문자를 포함하지 않을 이해합니다. 그런 다음 벡터를 채울 때 제외해야합니다. 당신의 currenct 문자를 가정하면 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

입력 "아바"나는 당신이 불행하게도 – 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

나는 카운트를 저장하기 위해지도를 사용하는 것이 좋습니다 것입니다.

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

등 ASCII 7

에 대한 0x07를 얻기 위해 좋을 것이다, 그것은 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를 참조하십시오

+0

고마워, 좋은 생각이야. – Napalidon

관련 문제