Re: Problem while splitting the line using a delimiter and pushing
it
into an array
On Fri, 21 Nov 2008 05:37:50 -0800, Prasanth wrote:
I have file named as "test.txt". The contents of the file are as follows
:
item1,sal,1000
item2,sal,2000
I am trying to read the file. And spilt each line as per delimiter ","
and push it into an array. That is
array[0][0] = item1
array[0][1] = sal
array[0][2] = 1000
array[1][0] = item2
array[1][1] = sal
array[1][2] = 2000
Please help me out over here
The program which i have written is below:
Phew, there are so many things wrong with this I don't know where to begin
Firstly, if you're to program in C++, better to use the C++ (as opposed to
C) headers: they're called things like <iostream>, <fstream>, etc.
(no .h). The difference is that they put all functionality in "namespace
std" (read up about namespaces).
#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <fstream.h>
#include <process.h>
int main()
{
clrscr();
ifstream inf;
char line[80];
char a[10][10];
Usually a bad idea to use arrays, particularly with arbitrary sizes (and
no error checking in your code). Those are all buffer overflows waiting to
happen.
inf.open("c:\\test.txt");
{
Why the extra nested block here?
int j=0;
int w=0;
int i;
In C++ it's generally viewed as good style to declare variables just
before you use them.
while(!inf.eof())
This doesn't do what you think it does... anyway, this is not the best way
to read lines of text (see below)
{
cout << line;
Um... you've not actually *read* the line from the file"!
for(i=0;i<80;i++,j++)
Note that "i" here is not the same "i" you declared above (but j is).
{
cout << line[i] << endl;
a[w][j] = line[i];
if(line[i] == ' ')
w++;
}
Yikes.
}
}
cout << a[1];
inf.close();
getch();
return 0;
}
Please help me out as soon as possible.
This looks a lot like homework... if it is, the code below should fail
you, as there's no way it could be your own work ;-)
Read up in particular about the std::string class and std::vector template
class. They're probably the most useful things you'll ever use in C++.
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
// all standard library stuff is in namespace std
// Don't use this in a header file, though.
using namespace std;
int main()
{
ifstream inf("test.txt");
if (!inf) {
cerr << "Failed to open file\n";
return 1;
}
// read about std::vector
vector< vector<string> > a;
// read about std::string
string line;
// This loop works, because getline() returns false (sort of)
// when there is nothing more to read.
while (getline(inf,line)) {
cout << "line = \"" << line << "\"\n";
a.push_back(vector<string>());
// We use find() to find the delimiters and
// substr() to yank out the text
string::size_type pos1 = 0;
string::size_type pos2 = line.find(',');
while (pos2 != string::npos) {
a.back().push_back(line.substr(pos1,pos2-pos1));
pos1 = pos2+1;
pos2 = line.find(',',pos1);
}
a.back().push_back(line.substr(pos1,pos2-pos1));
}
// Now eof should be set
if (!inf.eof()) {
cerr << "Something went wrong reading file\n";
return 1;
}
inf.close();
for (size_t i=0;i<a.size();++i) {
cout << '\n';
for (size_t j=0;j<a[i].size();++j) {
cout << "a[" << i << "][" << j << "] = \"" << a[i][j] << "\"\n";
}
}
return 0;
}
--
Lionel B