Reputation: 4733
Code :
int question_3()
{
fstream hardware("hardware.dat" , ios::binary | ios::in | ios::out);
if (!hardware)
{
cerr << "File could not be opened." << endl;
exit(1);
}
HardwareData myHardwareData;
for (int counter = 1; counter <= 100; counter++)
{
hardware.write(reinterpret_cast< const char * >(&myHardwareData), sizeof(HardwareData));
}
cout << "Successfully create 100 blank objects and write them into the file." << endl;
.
.
.
Result :
Why the file could not be opened?
If the file "hardware.dat" do not exist, the program will create the file with that name. Why not?
If I first create the file like the following, the program will continue.
![enter image description here][2]
Thank you for your attention.
Final Solution :
int question_3()
{
cout << "Question 2" << endl;
fstream hardware; <---Changed
hardware.open("hardware.dat" , ios::binary | ios::out); <---Changed
if (!hardware)
{
cerr << "File could not be opened." << endl;
exit(1);
}
HardwareData myHardwareData;
for (int counter = 1; counter <= 100; counter++)
{
hardware.write(reinterpret_cast< const char * >(&myHardwareData), sizeof(HardwareData));
}
cout << "Successfully create 100 blank objects and write them into the file." << endl;
hardware.close(); <---Changed
hardware.open("hardware.dat" , ios::binary | ios::out | ios::in); <---Changed
.
.
.
Upvotes: 1
Views: 3485
Reputation: 4951
the ios::in
specifies you want to open an existing file for reading. Since you don't seam want to read anything you shoul jsut stick to ios::out
which will create the file if it does not exist and open it for writing.
Upvotes: 1
Reputation: 22157
Why are you opening your file with both ios::in
and ios::out
flags (it seems that you're only writing to this file)? ios::in
will require an existing file:
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
fstream f1("test1.out", ios::binary | ios::in | ios::out);
if(!f1)
{
cout << "test1 failed\n";
}
else
{
cout << "test1 succeded\n";
}
fstream f2("test2.out", ios::binary | ios::out);
if(!f2)
{
cout << "test 2 failed\n";
}
else
{
cout << "test2 succeded\n";
}
}
output:
burgos@olivia ~/Desktop/test $ ./a.out
test1 failed
test2 succeded
Maybe you want to use ios::app
?
Upvotes: 3
Reputation: 66371
When you specify both ios::in
and ios::out
, the file must exist - it will not be created.
If you're just writing, use only ios::out
.
Upvotes: 1