source: Sophya/trunk/Eval/COS/pbseekios.cc@ 2538

Last change on this file since 2538 was 2428, checked in by ansari, 22 years ago

Indication probleme avec lecture sous MacOSX 10.2 (g++ 3.1) apres lecture dernier byte du fichier - Reza 12/09/2003

File size: 4.7 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <math.h>
4#include <iostream>
5#include <fstream>
6
7using namespace std;
8
9int tstseqwrite();
10int tstseqread();
11int tstseekbegread();
12int tstseekendread();
13
14// -----------------------------------------------------
15// This test program illustrates the problem with g++
16// (pb with g++ 2.95 3.0)
17// iostream library with seekg(..., ios::end)
18// R. Ansari (LAL/IN2P3-CNRS) - April 2002
19//
20// # compile the program
21// csh> g++ -o pbseekios pbseekios.cc
22// # Run the program, check the output and the return code
23// # Read with seekg(... ios::end) ---> wrong result (tstseekendread())
24// # while seekg(... ios::beg) works OK (tstseekbegread())
25// csh> ./pbseekios
26// September 2003
27// The problem with seekg(... ios::end) seems to be solved
28// with gcc 3.1,
29// However, on MacOSX 10.2, with gcc 3.1, reading the last byte of
30// a file causes an error and stream can not be positionned anymore
31// ----------------------------------------------------
32
33int main(int narg, char ** arg)
34{
35
36 int rc;
37 rc = tstseqwrite();
38 rc += tstseqread();
39 rc += tstseekbegread();
40 rc += tstseekendread();
41 if (rc == 0)
42 cout << "--- End of pbseekios - OK (Rc=0) " << endl;
43 else
44 cout << "--- End of pbseekios - ERRORS (Rc= " << rc << ")" << endl;
45 return (rc);
46}
47
48// ------ Test function to write sequentially to a ofstream ------
49int tstseqwrite()
50{
51 int i;
52 int iv;
53 float fv;
54 char * flnm = "pbseekios.dat";
55 ofstream os(flnm, ios::out | ios::binary);
56 cout << ">>>> tstseqwrite() - Sequential writing to file " << flnm << endl;
57 // ofstream os(flnm, ios::out );
58 for(i=0; i<7; i++) {
59 iv = 1000+i*10;
60 fv = iv+0.5;
61 os.write((char const*)(&iv), sizeof(int));
62 os.write((char const*)(&fv), sizeof(float));
63 }
64 return(0);
65}
66
67// ------ Test function to read sequentially from a ifstream ------
68int tstseqread()
69{
70 int i;
71 int iv,iv0;;
72 float fv, fv0;
73 long pos;
74 char * flnm = "pbseekios.dat";
75// is = new ifstream(flnm, ios::in | ios::binary);
76 ifstream is(flnm, ios::in );
77 cout << ">>>> tstseqread() - Sequential reading from file " << flnm << endl;
78 int rc = 0;
79 for(i=0; i<7; i++) {
80 iv0 = 1000+i*10;
81 fv0 = iv0 + 0.5;
82 iv = 0; fv = 0.;
83 pos = is.tellg();
84 is.read((char *)(&iv), sizeof(int));
85 is.read((char *)(&fv), sizeof(float));
86 cout << "Read@" << i << " : Pos= " << pos << " IV=" << iv
87 << " FV= " << fv << " Expect:("
88 << iv0 << "," << fv0 << ")"
89 << " ->NewPos="<< is.tellg() << endl;
90 if (iv != iv0) rc++;
91 }
92 if (rc == 0)
93 cout << " tstseqread() OK , Rc= 0 " << endl;
94 else
95 cout << " tstseqread() ERROR , Rc= " << rc << endl;
96 return rc;
97}
98
99// ------ Random access read from a ifstream seek(ios::beg) ------
100int tstseekbegread()
101{
102 int i;
103 int num[7] = {2,4,1,6,5,3,0};
104 int iv,iv0;
105 float fv,fv0;
106 long pos;
107 char * flnm = "pbseekios.dat";
108// is = new ifstream(flnm, ios::in | ios::binary);
109 ifstream is(flnm, ios::in );
110 cout << ">>>> tstseekbegread() - Random access reading from file "
111 << flnm << " (seekg(... ios::beg) " << endl;
112 int rc = 0;
113 for(i=0; i<7; i++) {
114 iv0 = 1000+num[i]*10;
115 fv0 = iv0 + 0.5;
116 iv = 0; fv = 0.;
117 is.seekg(num[i]*(sizeof(int)+sizeof(float)), ios::beg);
118 pos = is.tellg();
119 is.read((char *)(&iv), sizeof(int));
120 is.read((char *)(&fv), sizeof(float));
121 cout << "Read@" << num[i] << " : Pos= " << pos << " IV=" << iv
122 << " FV= " << fv << " Expect:("
123 << iv0 << "," << fv0 << ")"
124 << " ->NewPos="<< is.tellg() << endl;
125 if (iv != iv0) rc++;
126 }
127 if (rc == 0)
128 cout << " tstseekbegread() OK , Rc= 0 " << endl;
129 else
130 cout << " tstseekbegread() ERROR , Rc= " << rc << endl;
131 return rc;
132}
133
134// ------ Random access read from a ifstream seek(ios::end) ------
135int tstseekendread()
136{
137 int i;
138 int num[7] = {2,4,1,6,5,3,0};
139 int iv,iv0;
140 float fv,fv0;
141 long pos;
142 char * flnm = "pbseekios.dat";
143// is = new ifstream(flnm, ios::in | ios::binary);
144 ifstream is(flnm, ios::in );
145 cout << ">>>> tstseekendread() - Random access reading from file "
146 << flnm << " (seekg(... ios::end) " << endl;
147 int rc = 0;
148 for(i=0; i<7; i++) {
149 iv0 = 1000+num[i]*10;
150 fv0 = iv0 + 0.5;
151 iv = 0; fv = 0.;
152 is.seekg((num[i]-7)*(sizeof(int)+sizeof(float)), ios::end);
153 pos = is.tellg();
154 is.read((char *)(&iv), sizeof(int));
155 is.read((char *)(&fv), sizeof(float));
156 cout << "Read@" << num[i] << " : Pos= " << pos << " IV=" << iv
157 << " FV= " << fv << " Expect:("
158 << iv0 << "," << fv0 << ")"
159 << " ->NewPos="<< is.tellg() << endl;
160 if (iv != iv0) rc++;
161 }
162 if (rc == 0)
163 cout << " tstseekendread() OK , Rc= 0 " << endl;
164 else
165 cout << " tstseekendread() ERROR , Rc= " << rc << endl;
166 return rc;
167}
168
Note: See TracBrowser for help on using the repository browser.