这是我第一次来这里。我自己从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
感谢您的帮助。
答案 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
数组,但其中的内存未初始化。
总结一下,您当前输出的原因是由于程序逻辑中存在问题,而read
和write
的错误使用会造成潜在问题。
感谢您的阅读。
答案 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
仍然是未初始化的数组。