2009-07-04 12 views
1

Project Euler Problem 8をC++で解決しようとしています。問題は1000桁の数字の中で5つの連続する数字の中で最大のものを見つけることです。ですから、ファイルioを使用して数値をchar配列に読み込んで、後で整数に変換する方法を理解しようとしています。最後の行の最後の3分の1を除いて読んだ作品は、私は奇妙な線、緑のランタンのシンボル、そして心臓を得る。ファイルからの入力からの読み込みで奇妙な記号が表示される

alt text

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

const int maxNum = 1000; 
char buffer[maxNum]; 
char *bufferPointer = buffer; 

ifstream infile; 
infile.open("numberlist.txt"); 

if (!infile) 
{ 
    cerr << "Error: Open file failure" << endl; 
    return -1; 
} 

infile.read(bufferPointer, streamsize(maxNum)); 
infile.close(); 
cout << buffer << endl; 
return 0; 

} 

これは、txtファイルが含まれているものです:

73167176531330624919225119674426574742355349194934 
96983520312774506326239578318016984801869478851843 
85861560789112949495459501737958331952853208805511 
12540698747158523863050715693290963295227443043557 
66896648950445244523161731856403098711121722383113 
62229893423380308135336276614282806444486645238749 
30358907296290491560440772390713810515859307960866 
70172427121883998797908792274921901699720888093776 
65727333001053367881220235421809751254540594752243 
52584907711670556013604839586446706324415722155397 
53697817977846174064955149290862569321978468622482 
83972241375657056057490261407972968652414535100474 
82166370484403199890008895243450658541227588666881 
16427171479924442928230863465674813919123162824586 
17866458359124566529476545682848912883142607690042 
24219022671055626321111109370544217506941658960408 
07198403850962455444362981230987879927244284909188 
84580156166097919133875499200524063689912560717606 
05886116467109405077541002256983155200055935729725 
71636269561882670428252483600823257530420752963450 

編集:私はこの問題を掲載直後、私はただ問題は、読み取りが新しいを読んでいるという事実であるかもしれない実現したがって配列はそれをすべて保持するのに十分な大きさではありません。あなたがのstd ::文字列の代わりに、文字の

これはおそらく修正しまう問題のプレーンな配列を使用してに切り替えた場合

答えて

3

コードに2つの問題があります。

まず、maxNumのバッファサイズの改行を考慮していないように見えるので、テキストファイルの最後の前に19文字または38文字の読み込みを停止します(UnixスタイルのWindowsスタイルの改行)。それに応じてmaxNumの値を増やすか、テキストファイルから改行を削除してください。

第2に、バッファを保持するためにstd :: stringの代わりにchar配列を使用しているため、ストリーム演算子を使用すると正しく表示されるためにはNULL終端する必要があります。バッファを読み込んだ後に次の行を追加します(余分な文字を考慮するには、バッファサイズを1増やす必要があります)。

また
buffer[maxNum-1] = '\0'; 

、あなたは次のように、ヌル終端ではありません知ら長のバッファを表示する)(cout.writeを使用することができます。

cout.write(buffer, maxNum); 
+0

を使用することができますvector<char> v

、テキストは1038文字の長さで、私は理由を理解することはできません。私はそれぞれ50文字の20行を数え、19行の新しい行を考えると、私は指を置くことができないものの2倍の量があります。 –

+0

@ L1th1um:UNIXスタイルのテキストファイルは、改行として1文字(LF)を使用します。 Windowsスタイルのテキストファイルは、改行として2文字(CR/LF)を使用します。テキストファイルの作成に応じて、正確な文字数が異なる場合があります。 – goldPseudo

2

まあ、これはC++非常に慣用的ではありません、あなたは素晴らしい結果を得る可能性があります。

これは、数字のリストが1000文字を超えているため、バッファに収まりません。

0

私はまた、このようなstd::string sとしてC++のストレージオブジェクトを使用することをお勧めしますまたはstd::vector<char> v。あなたには、いくつかの理由でistream_iterator<char> ifi(infile)、およびstd::copy(ifi, istream_iterator<char>(), back_inserter(v))

関連する問題