I am trying to modify a program to read in a file that will then output it to a new file without all the whitespace in between the data. This is so I can convert it to a csv file and read it into paraview to make a visualization of a human skull. I don't have a lot of experience with fstream, but I know that is what I need to use. Here is the code I have so far
#include <fstream>
#include <iostream>
#include <string>
//pdisk.cpp
using namespace std;
class Pdisk {
public:
Pdisk(int numberofblocks, int blocksize, string diskname);
int getblock(int blocknumber, string& buffer);
int putblock(int blocknumber, string buffer);
private:
string diskname;
int numberofblocks;
int blocksize;
};
Pdisk::Pdisk(int numberofblocks, int blocksize, string diskname)
{
fstream iofile;
iofile.open(diskname.c_str(), ios::in|ios::out);
iofile.close();
if (iofile.fail())
{
cout << "File does not exist" << endl;
ofstream newfile;
newfile.open(diskname.c_str());
for (int i = 0; i < (numberofblocks * blocksize); i++)
{
newfile << "*"; // fill file with '*'
}
cout << "File created successfully" << endl;
newfile.close();
iofile.open(diskname.c_str(), ios::in|ios::out);
this->diskname = diskname;
this->blocksize = blocksize;
this->numberofblocks = numberofblocks;
iofile << numberofblocks << " " << blocksize << " ";
iofile.close();
}
else
{
iofile.open(diskname.c_str(), ios::in|ios::out);
this->diskname = diskname;
this->blocksize = blocksize;
this->numberofblocks = numberofblocks;
iofile >> numberofblocks; //read numberofblocks from file
iofile >> blocksize; //read blocksize from file
// cout << "File exists - Number of blocks: " << numberofblocks << endl;
// cout << "File exists - Blocksize: " << blocksize << endl << endl;
iofile.close();
}
} // Pdisk
int Pdisk::getblock(int blocknumber, string& buffer)
{
fstream iofile;
iofile.open(this->diskname.c_str(), ios::in|ios::out);
if (iofile.fail())
{
cout << endl << "Getblock failed when opening file" << endl;
return 0;
}
else
{
if (blocknumber > this->numberofblocks)
{
cout << endl << "Blocknumber doesn't exist. Getblock failed" << endl;
return 0;
}
else
{
iofile.seekg((blocknumber*blocksize), ios::beg);
char x;
buffer = ""; // clear buffer
for (int i=0; i<this->blocksize; i++)
{
// iofile >> x;
iofile.get(x);
buffer = buffer + x;
}
// cout << "Contents of getblock buffer are " << endl;
// cout << buffer << endl << endl;
iofile.close();
return 1;
}
}
}
int Pdisk::putblock(int blocknumber, string buffer)
{
fstream iofile;
iofile.open(this->diskname.c_str(), ios::in|ios::out);
// cout << "Filename: " << this->diskname.c_str() << endl;
// cout << "Number of blocks: " << numberofblocks << endl;
// cout << "Blocksize: " << blocksize << endl;
if (iofile.fail())
{
cout << endl << "Putblock failed when opening file" << endl;
return 0;
}
else if (blocknumber == 0)
{
cout << "Block 0 is write-protected. Unable to complete request!!!" << endl;
return 0;
}
else if (blocknumber > this->numberofblocks)
{
cout << endl << "Blocknumber is out of range. Getblock failed" << endl;
return 0;
}
else
{
iofile.seekp((blocknumber*blocksize), ios::beg);
cout << endl << "Putblock success" << endl;
// cout << "Buffer.size = " << buffer.size() << endl;
// cout << "Blocksize = " << blocksize << endl;
if (buffer.size() == blocksize)
{
iofile << buffer; // write contents of buffer to file
}
else
{
cout << "Size of buffer is not the same as blocksize" << endl;
return 0;
}
iofile.close();
return 1;
}
}
int no_blocks = 16;
int size_of_block = 30;
int putblockfail;
int getblockfail;
int main()
{
Pdisk disk1(no_blocks, size_of_block, "hw1.txt");
string block1, block2, block3, block4;
for (int i=0; i<size_of_block; i++)
{
block1 = block1 + "1";
block2 = block2 + "2";
block3 = block3 + "3";
block4 = block4 + "$";
}
putblockfail = disk1.putblock(8, block1);
if (putblockfail == 1)
{
cout << endl << "Block3 before getblock" << endl;
cout << block3 << endl << endl;
disk1.getblock(8, block3);
cout << "Block3 after getblock" << endl;
cout << block3 << endl;
}
putblockfail = disk1.putblock(3, block2);
if (putblockfail == 1)
{
cout << endl << "Block2 before getblock" << endl;
cout << block2 << endl << endl;
getblockfail = disk1.getblock(17, block2);
if (getblockfail == 1)
{
cout << "Block2 after getblock" << endl;
cout << block2 << endl;
}
disk1.putblock(1, block4);
}
} //end main
The file that I have to read in is 50 MB so I won't post the whole thing, but it has five columns of data for each line that are separated by more than 1 whitespace character. Here is a small example of the file:
0000000 4063268 7012368 2883603 3407915
0000020 1376285 1572886 2424870 2686998
0000040 2097198 458787 1572897 3604518
0000060 1114132 1835028 3276857 2228282
0000100 4390976 1310739 2228237 3604540
0000120 1114173 5242947 3539070 589868
0000140 3211327 786440 2424883 1114177
0000160 2424853 3932182 2556003 3342365
0000200 2031635 2818068 9240661 6684683
0000220 3014715 1507397 2883652 3145746
0000240 1835030 3866671 786491 1835049
0000260 1441804 1179663 4522007 1179688
0000300 1966109 3801126 6684716 2490408
0000320 917521 2883601 5374043 4587569
The int main() needs to be re-written but I am not sure how to change the Pdisk class itself.
Thanks