输出有什么问题?

时间:2014-12-15 03:50:54

标签: c++

这是我第一次来这里。我自己从Gaddis的“Starting Out With C ++”一书中学习C ++。所以我不知道该问谁,然后我找到了这个网站。希望你不介意帮助我,我会从你身上学到很多东西。

这是书中的一个问题:

编写一个名为arrayToFile的函数。该函数应该接受三个参数: le的名称,指向int数组的指针以及数组的大小。功能 应该以二进制模式打开指定的文件,将数组的内容写入 勒,然后关闭乐。 编写另一个名为fileToArray的函数。这个函数应该接受三个参数: le的名称,指向int数组的指针以及数组的大小。该 函数应该以二进制模式打开指定文件,将其内容读入数组, 然后关闭文件。 编写一个完整的程序,通过使用arrayToFile演示这些函数 函数将数组写入文件,然后使用fileToArray函数进行读取 来自同一文件的数据。将数据从le读入数组后,显示 屏幕上的数组内容。

这是我的代码:

# include <iostream>
# include <string>
# include <fstream>


using namespace std;

const int SIZE = 10;
bool arrayToFile(fstream&, int*, int);
bool fileToArray(fstream&, int*, int);

int main()
{
    int arr[SIZE] = { 10, 8, 9, 7, 6, 4, 5, 3, 2, 1 },
        arrTest[SIZE];

    fstream file;

    if (arrayToFile(file, arr, SIZE))
    {
        if (fileToArray(file, arr, SIZE))
        {
            for (int n = 0; n < SIZE; n++)
            {
                cout << arrTest[n] << " ";
            }

            cout << endl;
           return 0;
        }
    }


    return 1;


}

bool fileToArray(fstream &file, int* a, int size)
{

    file.open("t.dat", ios::in | ios::binary);
    if (!file)
    {
        cout << "Can't open file t.dat\n";
        return false;
    }


    file.read((char*)a, size);
    file.close();

    return true;

}

bool arrayToFile(fstream &file, int* a, int size)
{
    file.open("t.dat", ios::out | ios::binary);
    if (!file)
    {
        cout << "Can't open file t.dat\n";
        return false;
    }

    file.write((char*)a, size);
    file.close();

    return true;
}

这里是输出: -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -85 8993460 -858993460 -858993460

我不知道这里有什么问题,因为输出应该是这样的:10 8 9 7 6 4 5 3 2 1

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

在开始之前,您必须了解char的大小为sizeof(char)个字节且int的大小为sizeof(int)个字节,通常为1个字节,分别为4个字节。这意味着4 char s可以构成1 int

现在,如果您查看file.write((char*)a, size);,就可以将int*转换为char*,这意味着将a中的数据视为char而不是int s。

执行一些简单的数学运算,10 int的数组大小为10 * 4 = 40字节。但是,您写入文件的数据量为10 char s,只有10个字节。

接下来,您尝试将arr写入文件,然后从文件中读回arr。我假设您要阅读arrTest,但由于您未能这样做,尝试访问arrTest的内容会为您提供您看到的输出,正如其他人所解释的那样社区是未初始化的记忆。这是因为arrTest[SIZE]定义了一个SIZE数组,但其中的内存未初始化。

总结一下,您当前输出的原因是由于程序逻辑中存在问题,而readwrite的错误使用会造成潜在问题。

感谢您的阅读。

答案 1 :(得分:0)

file.write((char*)a, size);

size个字节写入文件。

file.read((char*)a, size);

size个字节读取到文件中。

您正在10使用size。您正在编写和读取10个字节的数据。您需要将这些行更改为:

file.write((char*)a, size*sizeof(int));

file.read((char*)a, size*sizeof(int));

使用正确的参数调用fileToArray。而不是

    if (fileToArray(file, arr, SIZE))

使用

    if (fileToArray(file, arrTest, SIZE))

没有它,arrTest仍然是未初始化的数组。