我正在尝试使用C ++解决Project Euler Problem 8,问题是找到1000位数字中5个连续数字的最大乘积。所以我试图找出如何使用文件io将数字读入一个char数组,我稍后将转换为整数。读取工作除了最后一行的最后三分之外我得到了奇怪的线条,一个绿色的灯笼符号和一颗心。
#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
编辑:我发布此问题后,我刚刚意识到问题可能是读取正在读取新行的事实,因此数组不足以容纳所有这些。
答案 0 :(得分:3)
您的代码有两个问题。
首先,看起来您没有考虑maxNum缓冲区大小的换行符,因此它会在文本文件结束前停止读取19或38个字符(取决于您使用的是Unix风格还是Windows式线断裂)。相应地增加maxNum的值,或从文本文件中删除换行符。
其次,由于您使用char数组而不是std :: string来保存缓冲区,因此如果使用stream运算符,则需要以null结尾才能正确显示。在读取缓冲区后添加以下行(您还需要将缓冲区大小增加1以考虑额外字符)。
buffer[maxNum-1] = '\0';
或者,您可以使用cout.write()显示非空终止的已知长度缓冲区,如下所示:
cout.write(buffer, maxNum);
答案 1 :(得分:2)
嗯,这不是非常惯用的C ++,如果切换到使用std :: string而不是简单的char数组
,你可能会得到很好的结果这可能会解决问题。
这个数字列表的长度超过1000个字符,因此不适合您的缓冲区。
答案 2 :(得分:0)
我还建议使用C ++存储对象,例如std::string s
或std::vector<char> v
。
使用vector<char> v
,您可以使用istream_iterator<char> ifi(infile)
和std::copy(ifi, istream_iterator<char>(), back_inserter(v))