473,241 Members | 1,662 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,241 software developers and data experts.

reading a mixed file

Hi, I have a file which I wish to read from C++. The file, created by
another programme, contains both text and numbers, all as ascii (it's
a .txt file). A sample of the file is shown below:

<< LEDAR V1.3 - Real Time Detection >>

<LEFT 144>
<TOP 165>
<RIGHT 265>
<BOTTOM 376>
<STEP 4>
<Kx 2.13068>
<Ky 0.882353>
<Detection 1>

25600055 1
299 299 299 299 299 297 297 297 297 297 297 297 297
299 299 299 299 299 297 297 297 297 297 297 297 297
299 299 299 299 299 297 297 297 297 297 297 297 297
299 299 299 299 299 297 297 297 297 297 297 297 297

26800055 2
300 300 300 300 299 297 297 297 297 298 299 299 299
300 300 300 300 299 297 297 297 297 298 299 299 299
300 300 300 300 299 297 297 297 297 298 299 299 299
300 300 300 300 299 297 297 297 297 298 299 299 299

28000055 3
300 300 300 300 301 301 301 300 301 301 301 301 300
300 300 300 300 301 301 301 300 301 301 301 301 300
300 300 300 300 301 301 301 300 301 301 301 301 300
300 300 300 300 301 301 301 300 301 301 301 301 300

Of the long lines, I want to read one line from each group, and ignore
everything else. I have relatively little experience with C++, and can
not find a suitable way to do this. Any suggestions? Please type a
small bit of sample code to show how suggested functions should be
used.

Thanks! Andrew
Jul 19 '05 #1
2 5188
adpsimpson wrote:
Hi, I have a file which I wish to read from C++. The file, created by
another programme, contains both text and numbers, all as ascii (it's
a .txt file). A sample of the file is shown below:

<< LEDAR V1.3 - Real Time Detection >>

<LEFT 144>
<TOP 165>
<RIGHT 265>
<BOTTOM 376>
<STEP 4>
<Kx 2.13068>
<Ky 0.882353>
<Detection 1>

25600055 1
299 299 299 299 299 297 297 297 297 297 297 297 297
299 299 299 299 299 297 297 297 297 297 297 297 297
299 299 299 299 299 297 297 297 297 297 297 297 297
299 299 299 299 299 297 297 297 297 297 297 297 297

26800055 2
300 300 300 300 299 297 297 297 297 298 299 299 299
300 300 300 300 299 297 297 297 297 298 299 299 299
300 300 300 300 299 297 297 297 297 298 299 299 299
300 300 300 300 299 297 297 297 297 298 299 299 299

28000055 3
300 300 300 300 301 301 301 300 301 301 301 301 300
300 300 300 300 301 301 301 300 301 301 301 301 300
300 300 300 300 301 301 301 300 301 301 301 301 300
300 300 300 300 301 301 301 300 301 301 301 301 300

Of the long lines, I want to read one line from each group, and ignore
everything else.


I assumed in the code below that you could assume that the header will
always be the same number of lines. If that's not the case, then you
should write some type of function that will look for a sentinal or
whatever is appropriate. I also assumed that each group will have four
long lines.

Some other points about the code: note that the return types of the two
helper functions are string and vector<int>. Returning large types by
value requires creating and copying a temporary object. This, in some
applications is an unnecessary overhead, but it probably won't be a
significant bottleneck in this case.

/////////////////////////////////////////////
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <sstream>

using namespace std;

string read_group();
vector<int> parse_line(const string&);

int
main()
{
string junk;

const int LEADING_TEXT = 11;

for (int i = 0; i < LEADING_TEXT; ++i)
getline(cin, junk);

int line_number = 1;
while (true) {
string line = read_group();
if (line == "")
break;

cout << "line " << line_number << ": \'" << line << "\'\n";

vector<int> value = parse_line(line);
cout << "{ ";
copy(value.begin(), value.end(), ostream_iterator<int>(cout, " "));
cout << " }\n";
}

return 0;
}

string
read_group()
{
const int LINES_PER_GROUP = 4;
string junk;
getline(cin, junk); // '25600055 1'
if (!cin)
return "";

string line;
getline(cin, line); // this is the line of interest

for (int i = 0; i < LINES_PER_GROUP; ++i)
getline(cin, junk); // 3 more lines, plus a blank.
// The blank may not exist after
// the last group, but you may be
// able to ignore that.

return line;
}
vector<int>
parse_line(const string& line)
{
vector<int> v;
int i;
istringstream iss(line);

while (iss >> i)
v.push_back(i);

return v;
}
////////////////////////////////////////
--
Adam Fineman

(Reverse domain name to reply.)

Jul 19 '05 #2

"adpsimpson" <a_***********@hotmail.com> wrote in message
news:51**************************@posting.google.c om...
Hi, I have a file which I wish to read from C++. The file, created by
another programme, contains both text and numbers, all as ascii (it's
a .txt file). A sample of the file is shown below:

<< LEDAR V1.3 - Real Time Detection >>

<LEFT 144>
<TOP 165>
<RIGHT 265>
<BOTTOM 376>
<STEP 4>
<Kx 2.13068>
<Ky 0.882353>
<Detection 1>

25600055 1
299 299 299 299 299 297 297 297 297 297 297 297 297
299 299 299 299 299 297 297 297 297 297 297 297 297
299 299 299 299 299 297 297 297 297 297 297 297 297
299 299 299 299 299 297 297 297 297 297 297 297 297

26800055 2
300 300 300 300 299 297 297 297 297 298 299 299 299
300 300 300 300 299 297 297 297 297 298 299 299 299
300 300 300 300 299 297 297 297 297 298 299 299 299
300 300 300 300 299 297 297 297 297 298 299 299 299

28000055 3
300 300 300 300 301 301 301 300 301 301 301 301 300
300 300 300 300 301 301 301 300 301 301 301 301 300
300 300 300 300 301 301 301 300 301 301 301 301 300
300 300 300 300 301 301 301 300 301 301 301 301 300

Of the long lines, I want to read one line from each group, and ignore
everything else. I have relatively little experience with C++, and can
not find a suitable way to do this. Any suggestions? Please type a
small bit of sample code to show how suggested functions should be
used.

Thanks! Andrew


You have to find patterns that you can look for that identify where you are
in your file. This means that you should read in each line and parse it. If
I get you correctly then you want to read only one line of the blocks of 4
lines, each containing 13 numbers. There are many ways you can do this. The
basic idea is that you have to find the start and the end of the block. Thus
you should be looking for things that definitely won't change. If every
block has a header of two numbers you can look for a line containing only
two numbers and read the next line. Go on reading until you reach the next
line containing only two integers. Of course this works only under the
assumption that there will always be a line with two numbers only before
your block starts!

The following code will show you one way to do it though it definitely is
not the only or probably the best way. Nevertheless it should give you an
idea and you should be able to come up with something yourself.

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

using namespace std;

template< typename T>
std::vector<T> MyStringToVector( const std::string& Str );

int main()
{
ifstream In("c:\\myprojects\\test\\test.dat");
vector<int> LineContents;
string Line;

if( !In ) {
cerr << "Can't open input file" << endl;
return false;
}

while( getline( In, Line ) ) {
if( Line.find("<") == string::npos ) {
LineContents = MyStringToVector<int>( Line );
if( LineContents.size() <= 2 && LineContents.size() > 0 ) {
getline( In, Line );
cout << Line << endl;
}
}
}

return true;
}
////////////////////////////////////////////////////////////////////////////
//
template< typename T>
std::vector<T> MyStringToVector( const std::string& Str )
// Tokenize a passed line/string into a vector
// e.g:
// std::string str = "1 2 3 4";
// std::vector<int> vec = StringToVector<int>(str);
////////////////////////////////////////////////////////////////////////////
//
{
std::istringstream iss( Str );
std::vector<T> MyVec;
std::copy( std::istream_iterator<T>(iss), std::istream_iterator<T>(),
back_inserter( MyVec ) );
return MyVec;
}

HTH
Chris
Jul 19 '05 #3

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

8
by: Yeow | last post by:
hello, i was trying to use the fread function on SunOS and ran into some trouble. i made a simple test as follows: i'm trying to read in a binary file (generated from a fortran code) that...
3
by: Sivaraj G via .NET 247 | last post by:
We created a unicode file using java application. It usesmethods like writeUTF(), writeInt() of java.io.DataOutputStreamclass to write the content of the file. We are able to read datausing...
2
by: Matt McGonigle | last post by:
Hi all, Please help me out with this. Perhaps it is a dumb question, but I can't seem to make it work. I am doing a file conversion using an unformatted binary file for input and outputting to...
4
by: Ganesh Muthuvelu | last post by:
Hi STAN, Stan: Thanks for your response to my previous post on reading a XSD file using your article in "https://blogs.msdn.com/stan_kitsis/archive/2005/08/06/448572.aspx". it works quite well...
8
by: Edward Diener | last post by:
By reuse, I mean a function in an assembly which is called in another assembly. By a mixed-mode function I mean a function whose signature has one or more CLR types and one or more non-CLR...
0
by: emu | last post by:
Hi All, I have an unmanaged C++ application that references a mixed mode image DLL (mixed managed and unmanaged). Under .NET 1.1 we could trust the dll (the mixed mode dll) by running the...
10
by: Tyler | last post by:
Hello All: After trying to find an open source alternative to Matlab (or IDL), I am currently getting acquainted with Python and, in particular SciPy, NumPy, and Matplotlib. While I await the...
7
by: =?Utf-8?B?SmltIFdhbHNo?= | last post by:
I'm new to working with mixed assemblies. All of my previous experience has been with VC++/MFC in native, unmanaged applications. When I create a mixed assembly in which one or more of the files...
32
by: Bill Cunningham | last post by:
I am interested in writing a numeric text reader. This only reads numbers of securities and stores them. Nice practice. I have determined that these functions are needed. isalpha, isdigit,...
0
by: jianzs | last post by:
Introduction Cloud-native applications are conventionally identified as those designed and nurtured on cloud infrastructure. Such applications, rooted in cloud technologies, skillfully benefit from...
0
by: abbasky | last post by:
### Vandf component communication method one: data sharing ​ Vandf components can achieve data exchange through data sharing, state sharing, events, and other methods. Vandf's data exchange method...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: fareedcanada | last post by:
Hello I am trying to split number on their count. suppose i have 121314151617 (12cnt) then number should be split like 12,13,14,15,16,17 and if 11314151617 (11cnt) then should be split like...
0
by: stefan129 | last post by:
Hey forum members, I'm exploring options for SSL certificates for multiple domains. Has anyone had experience with multi-domain SSL certificates? Any recommendations on reliable providers or specific...
0
by: MeoLessi9 | last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.