LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   C++ text file line by line/each line to string/array (https://www.linuxquestions.org/questions/programming-9/c-text-file-line-by-line-each-line-to-string-array-126337/)

Dimitris 12-16-2003 09:06 AM

C++ text file line by line/each line to string/array
 
Hello,

I need help in C++

I am trying to write a program but I am stuck as I have to read a serial text file .txt which is like this:

1 2 3 4 5 6 7 .....till 100 but can also be less
23 34 34 5 4 54 ...till the number of the first line

The first line is like the ID and the other one the score (or anything) of each ID.

So what I need to know is how to read a text file line by line and put each line to an array which I don't know it's length...actually that's a string.

Any help would be really helpfull !

Regards,
Dimitris

deiussum 12-16-2003 11:19 AM

Just off the top of my head, I'd say, use ifstream::getline and an istrstream class.

Here's a quick app as an example.

Code:

#include <iostream>
#include <fstream>
#include <strstream>

using namespace std;

int main()
{
        char buffer1[2048];
        char buffer2[2048];
        istrstream ostr1(buffer1, 2048);
        istrstream ostr2(buffer2, 2048);
        int values1[100];
        int values2[100];
        int c=0;

        ifstream fin("data.txt");

        fin.getline(buffer1, 2048);
        fin.getline(buffer2, 2048);

        while (ostr1 >> values1[c])
        {
                ostr2 >> values2[c++];
        }

        for (int i=0;i<c;i++)
        {
                cout << values1[i] << ":" << values2[i] << endl;
        }

        return 0;
}


dakensta 12-17-2003 06:40 PM

Code:

#include <sstream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>

using namespace std;

void put_into_vector( ifstream& ifs, vector<int>& v )
{
  string s;
  getline( ifs, s );
  istringstream iss( s );
  // not the fastest method ...
  copy( istream_iterator<int>( iss ), istream_iterator<int>(), back_inserter( v ) );
}

int main()
{
  vector<int> line_1, line_2;

  ifstream ifs( "data.txt" );

  put_into_vector( ifs, line_1 );
  put_into_vector( ifs, line_2 );

}

note: istrstream is deprecated, istringstream is the current class to use.

Post this on gamedev, btw?

dakensta 12-17-2003 06:49 PM

Or if you only want to read a text file;

Code:

#include <string>
#include <fstream>
#include <vector>

using namespace std;

int main()
{
  vector<string> text_file;

  ifstream ifs( "data.txt" );
  string temp;

  while( getline( ifs, temp ) )
    text_file.push_back( temp );
}


Dimitris 12-19-2003 05:38 AM

Thanks alot for your replies!
I really appreciate it, and yes I did post it there too.

Have a nice day,

mani_um 11-29-2006 09:25 PM

C++ read first line
 
hi sir wanna ask u question

anyone can help how to read and modify only first row without read all the lines for example

This is input file named as test.dat

HIHOW R U 233434 45456564767Y
skskddfggkfgkfg dfdklgfglfl;g
dfk;l 24545 g54545465454544
gfgfgf54 1214


i want a c++ program to read the file line and append number at back
for example add 1 at back like this
"HIHOW R U 233434 45456564767Y"

TO

"HIHOW R U 233434 45456564767Y1"


any one can help with this

thanks in advance

regards,
mani

dmail 11-29-2006 10:08 PM

The only ways I know of(maybe wrong)is to read the whole file into a buffer add to it and rewrite the whole file.
or
read a line in append to it, write the new line to another file until to have written all the data plus what you want to append to it.

new_cpp_programmer 05-02-2007 05:18 PM

reading non-integer values from a table in a text file
 
Hi, everyone
I have a similar problem, but with non-integer numbers
I would like to read a table like this, from a txt file. The first line represents the x_values of the table, the second line provides the y_values of the table, and then it follows the z_values for the different x and y values

0.5 0.89 0.95 1.5 3.0 8.0 22.5
0.0 5.0 10
1.12 1.13 1.15 1.18 2.4 3.67 6.9
2.12 2.13 2.15 2.18 5.4 3.67 6.9
3.12 3.13 3.15 3.18 3.4 4.67 8.9

the problem is that I need to read and save this kind of information from different files, which will not always have the same dimensions
Could anyone help me, please?
Thanks so much

I have modified the file provided by dakensta on the 12-18-03 at 01:40 AM and it works fine with Microsoft VISUAL C++
But it does not work with Open Watcom compiler :-( It seems that the getline() function is not recognized...
Has anyone faced this problem before? How can I solve it? Thanks so much !!!

atngalbreaker 12-03-2007 06:45 PM

hi guys
 
we have a project in c++ that includes dna codes.

we need to read the whole dna code in the text file to see how many times
our inputed code occurred and in what location it occurred.

for example we inputed ggccgg

the program will then read from the text file to see how many times it occurred and its location.

the problem is i forgot how to read from a text file..huhu :(

i need your help guys thanks

lali.p 12-04-2007 03:19 AM

Hi, I have written a similar program using STL.
Here are the details of my program. It reads a text file and then asks the user to enter a string.
It then displays how many times the string occurs and also prints the lines in which it occurs.
I hope it solves your purpose ?

So here's the code :
Code:

#include<map>
#include<iostream>
#include<string>
#include<fstream>
#include<sstream>
using std::istringstream;
using std::ifstream;
using std::string;
using std::cout;
using std::cin;
using std::cerr;
using std::map;
using std::multimap;
int main()
{
        multimap<string,int> words;
        map<int,string> lines;
        string str;
        ifstream input("test.txt");
        if(input.fail())
        {
                cerr<<"\nThe file could not be opened.";
                return -1;
        }
        int i=1;
        while(getline(input,str))
        {
                istringstream in(str);
                string s;
                while(in>>s)
                {
                        words.insert(make_pair(s,i));
                }
                lines.insert(make_pair(i,str));
                i++;
        }
        string search;
        cout<<"\nEnter a word to search: ";
        cin>>search;
        cout<<"\nThe number of matches = "<<words.count(search)<<'\n';
        multimap<string,int>::iterator it1=words.lower_bound(search);
        multimap<string,int>::iterator it2=words.upper_bound(search);
        while(it1!=it2)
        {
                int x=it1->second;
                map<int,string>::iterator iter=lines.find(x);
                cout<<'\n'<<x<<" ) "<<iter->second<<'\n';
                it1++;
                while(true)
                {
                        if(it1!=it2 && it1->second==x)
                        {
                                it1++;
                               
                        }
                        else
                        {
                                break;
                        }
                }
        }
        return 0;
}

What the code does is that it stores each line number and line in a map and each word and its associated line number in a multimap(because each line may contain more than 1 similar words)

Rest is simple( i guess ?) :P


I usually have a hard time explaining things:-(, hope you'll figure out
the rest.

atngalbreaker 12-11-2007 12:07 AM

hi thanks for the help!!! i have another problem in c++
its about the tower of hanoi... sad it say its my first
time to encounter this problem... :( i need help again..

lali.p 12-11-2007 02:08 AM

ooops your home work !!!
 
Dude seems like you are posting your homework over here. *BAD THING*

Anyway, in case you may be in a situation where you want the solution.
Here's it :
Code:

#include<iostream>
using std::cout;
using std::cin;
void hanoi(int,int,int,int);
void move(int,int);
int main()
{
        int plates=2;
        int from=1,to=2,via=3;
        hanoi(plates,from,to,via);
        return 0;
}
void move(int from,int to)
{
        cout<<'\n'<<from<<" "<<to;
}
void hanoi(int plates,int from,int to,int via)
{
        if(plates<0)
        {
                return;
        }
        hanoi(plates-1,from,via,to);
        move(from,to);
        hanoi(plates-1,via,to,from);
}

Please note that you won't gain anything by copy pasting anything.
You gonna learn only by yourself. I hope you are not cheating yourself.

anurade 03-05-2008 03:27 AM

Efficient way to read only 1st line from number of files
 
Hi,

I am struck up with some problem. I am analyzing on an efficient way to read number of files. Actually I want to read only the first line from each of them.
There could be hundreds of them in the directory/sub-directories; but not huge in size.
Can anyone suggest a way I can do it without compromising too much on memory and performance.

Thanks in advance.

/Anu

lppc2112 03-10-2008 12:13 PM

Stl program
 
Hello,

I have to use data structures an array or vector to store vertices in this program.

can anyone tell me how i can do it please?

#include<map>
#include<iostream>
#include<string>
#include<fstream>
#include<sstream>

using std::istringstream;
using std::ifstream;
using std::string;
using std::cout;
using std::cin;
using std::cerr;
using std::map;
using std::multimap;


int main()
{
multimap<string,int> words;
map<int,string> lines;
string str;
ifstream input("test.txt"); //create file for input
if(input.fail())
{
cerr<<"\nThe file could not be opened.";
return -1;
}
int i=1;
while(getline(input,str))
{
istringstream in(str);
string s;
while(in>>s)
{
words.insert(make_pair(s,i));
}
lines.insert(make_pair(i,str));
i++;
}
string search;
cout<<"\nEnter a word to search: ";
cin>>search;
cout<<"\nThe number of matches = "<<words.count(search)<<'\n';
multimap<string,int>::iterator it1=words.lower_bound(search);
multimap<string,int>::iterator it2=words.upper_bound(search);
while(it1!=it2)
{
int x=it1->second;
map<int,string>::iterator iter=lines.find(x);
cout<<'\n'<<x<<" ) "<<iter->second<<'\n';
it1++;
while(true)
{
if(it1!=it2 && it1->second==x)
{
it1++;

}
else
{
break;
}
}
}

cout<<'\n';

return 0;
}

ta0kira 03-10-2008 08:06 PM

My god, this thread is the walking dead! The things I would do if I knew how to come back to life 4 times ;)

lppc2112: Please create a new thread with more specific information about what you are trying to do and please enclose your code in [code]...[/code]. Thank you. :)
ta0kira


All times are GMT -5. The time now is 01:50 AM.