当ifstream将字符读入2D数组时,会出现奇怪的字符

时间:2017-05-25 19:54:07

标签: c++ arrays file-io char ifstream

我正在处理一个问题,要求我将包含单词拼图的.txt文件读入char类型的2D数组并输出找到的单词。 我在阅读拼图时遇到了麻烦。这是我现在使用的代码,用于读取.txt文件并打印尺寸和拼图本身:

ifstream in("puzzle.txt");
string line;
if (in.fail())
{
    cout << "Failed to open puzzle." << endl;
    exit(1);
}

int nrows = 0;
int ncols = 0;
getline(in, line);
ncols = line.size();
++nrows;
while(getline(in, line))
    ++nrows;

in.close();
cout << nrows << ", " << (ncols+1)/2 << endl;

// putting puzzle into a vector of vectors(2D array)
char A[nrows][ncols];
int r = 0;
int c = 0;
char ch;
in.open("puzzle.txt");
while (in >> ch)
{
    A[r][c] = ch;
    if (++c >= ncols)
    {
        c = 0;
        ++r;
    }
}
A[r][c] = 0;

for (int r = 0; r < nrows; ++r)
{
    for (int c = 0; c < ncols; ++c)
        cout << A[r][c] << " ";
    cout << endl;
}

现在有了这个代码,它似乎首先读了所有的字符,但随后是奇怪的字符。

结果看起来像8x8拼图:

8,8

r d z t t t t t t t k n n t t

d b b a r o o k e l a h w

a a c j i e p n d k s d e o e

m z i h z i y l a t x i s h h

e e l sJ≡o`:≡oαJ≡

o¿■`VΩo

   h ²

`              αJ≡oÇ

  ╢ 5 ╛ s ] 6 @   α J ≡ o

这个谜题以“e e l s”结尾。我不想要其余的。

另一个问题是,除了有奇怪的字符外,这个拼图还没有根据当前尺寸打印,每行只有8个字符。

我已经阅读了有关插入空字符的解决方案,但我仍然不太确定如何使用2D字符数组。

谢谢!

2 个答案:

答案 0 :(得分:1)

ncols变量未获得您希望它拥有的值。因为line.size()返回数组的完整大小,包括分隔符。因此,双维数组填充错误的列数,最后一些行留下初始随机字符。

答案 1 :(得分:0)

当您阅读每个字符时,您不会跳过每行末尾的换行符。您可以使用cin.ignore()跳过它。

for (int r = 0; r < nrows; ++r) {
    for (int c = 0; c < ncols; ++c) {
        cin >> A[r][c];
    }
    cin.ignore();
}