alle begin is moeilijk

Status
Niet open voor verdere reacties.

jan68

Gebruiker
Lid geworden
19 apr 2012
Berichten
90
na jaren mij met visualbasic te hebben bezig gehouden
wilden ik mij met c++ verreiken
doch leverde direct problemen op
ik data uit een file inlezen om er verder me aan de slag te gaan
de data ziet er als volgt uit.
eerst de naam
volgende regel het aantal coordinaten regels
daarna de regel met de waardens.
HUIS1
35
1.00000 0.00000
0.99964 0.00080
0.99845 0.00126
0.98673 0.00264
0.97742 enz.enz.

ik heb het volgende stuk software geprobeerd


#include "stdafx.h"

#include <string>
#include <fstream>
#include <iostream>
using namespace std;

int main()
{
char letter;
int i;
string line;

ifstream reader("D:/TEST/COOR/HUIS1.COO");

if (!reader) {
cout << "Error opening input file" << endl;
return -1;
}

for (i = 0; !reader.eof(); i++) {

getline( reader , line ) ;
cout << line << endl ;
naam = line
}

reader.close();

return 0;
}

maar het uitlezen van de naam geeft al probleem laat staan de coordinaten
ik zou graag de naam eerst uitlezen daarna het aantal coordinaten regels in een array
dus
naam = huis1
NB = 35
X(1) = 1.00000 Y(1) = 0.00000
X(2) = 0.99964 Y(2) = 0.00080
X(3) = 0.99845 Y(3) = 0.00126
X(4) = 0.98673 Y(4) = 0.00264
X(5) = 0.97742 enz.enz.

wie kan mij helpen????
bij voorbaat dank.
 
Probeer het eens met de onderstaande code:

[cpp]
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

const std::string INPUT_FILE = "c:\\downloads\\test_input_data.txt";

typedef struct _data {
std::string name;
unsigned int size;
std::vector<double> coordinates;
} data;

int main()
{
std::ifstream input(INPUT_FILE.c_str(), std::ios_base::in);

if (!input) {
std::cerr << "Error opening input file " << INPUT_FILE << std::endl;
return -1;
}

data d;

input >> d.name;
input >> d.size;

double temp = 0;
for (unsigned int idx = 0; idx < d.size; ++idx) {
input >> temp;
d.coordinates.push_back(temp);
}

input.close();
return 0;
}
[/cpp]
 
hoy. CoD_nl
bedankt voor je reactie.
het ziet er beter uit met jou software code
alleen er zitten nog een enkel nadeel in.
bij het uitlezen van de waarden gebruik je "double" voor een groteren nauwkeurigheid
maar nu ontstaan er aan de achterkant van het getal afwijkingen veroorzaakt door de compiler
dus 0.996770000000004 maar ook de wetenschappelijke notatie komt voor
ik heb al geprobeerd de "double" terug te brengen naar "float" maar dat levert niet het gewenste resultaat
verder probeer ik nog steeds een naam aan de eerste string te geven naar dat lukt me niet.
naam = d.name ,het =teken geeft direct een fout melding.
dit geld teven voor het inlezen van de array X(1) = d.coordinates en Y(1)=
maar wie weet weet jij hiervoor ook wel een oplossing te bedenken
met grote dank.
jan
 
O ja CoD.nl
er was nog een klein probleemtje.
De X(1) en Y(1) waardes staan op (een) "1" regel
dus klop de input d.size niet, heb dit weten op te lossen
" for (unsigned int idx = 0; idx < (2 * d.size); ++idx) " iets te veranderen zoals je ziet
dit ook voor evt. volgers.
gr jan
 
Ik had gewoon de opbouw van de input uit jouw voorbeeld als voorbeeld genomen. En dat het op één regel staat zou niks uit mogen maken. Maar ik begrijp dat het probleem nu opgelost is? Een handige tip voor de volgende keer: plaats een geheel voorbeeld van de input. Verder had ik het voorbeeld gewoon even vlug uitgeschreven om je een duw in de juiste richting te geven, maar raad ik je aan op in de uiteindelijke implementatie ook iets van exception handeling toe te voegen om tot een betrouwbare applicatie te komen :p
 
coD_nl

De opbouw van mijn input was/is correct daar mankeerd niets aan.
Alleen kom ik niet verder, Omdat ik niet weet hoe ik de naam en de waardes er uit moet halen
zie vorige vraag(

verder probeer ik nog steeds een "naam" aan de eerste string te geven naar dat lukt me niet.
naam = de.name ,het = teken geeft direct een fout melding.
dit geld teven voor het inlezen van de array X(1) = de coordinate en Y(1) = de coordinate

ik hoop dat je begrijpt wat ik bedoel
en misschien heb je hiervoor ook een oplossing
gr jan
 
Uiteindelijk een stukje verder gekomen
IK kan nu de naam en het aantal number apart uitlezen en dan de coordinaten
maar erg mooi is het niet
Code:
#include "stdafx.h"

#include <iomanip>
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
#include <array>

std::vector<std::array<float, 2>> array;

int main()
{
	int I;
	std::ifstream file("D:/test/Coor/test.txt");
	std::string name;
	std::string nb;
	std::string line;

	getline(file, name);
	getline(file, nb);

	for (I = 0; !file.eof(); I++)
	    // Read a line of input from the file
		while (std::getline(file, line))
		{
		// `istringstream` behaves like a normal input stream
		// but can be initialized from a string
		std::istringstream iss(line);
		 
		float value1, value2;

		I = I + 1;

		if (iss >> value1 >> value2)
		{
			std::cout << "XB(" << I << ") = " << value1 << "    YB(" << I << ") = " << value2;
			array.emplace_back(std::array < float, 2 > {{value1,value2}});
		}
		std::cout << std::endl;
		}
}
tot zover ben ik gekomen
maar nu wilde ik een paar kleine wijzigingen toepassen en de code wat te verfraaien
Code:
#include "stdafx.h"
#include "xfoil.h"
#include "math.h"

#include <iomanip>
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
#include <array>
using namespace std;

using::cout;
using::setw;
using::endl;
using::vector;

int main()
{
	int I;
	ifstream file("D:/test/Coor/test.txt");
	string name;
	string nb;
	string line;
		
	getline(file, name);
	cout << setw(10) << name << endl;
	getline(file, nb);
	cout << setw(5) << nb << endl;

	
	for (I = 0; getline(file, nb); I++)
		// Read a line of input from the file
		While(getline(file, line)) 
	 {
		istringstrem iss(line);
		string value1, value2;
		
	 	I = I + 1;

        if (iss >> value1 >> value2)
		{
	           		  cout << setw(5) << "XB(" << I << ") = " << value1; 
		if ( I < 10 ) cout << setw(10) << "YB(" << I << ") = " << value2; 
		if ( I >= 10 ) cout << setw(9) << "YB(" << I << ") = " << value2;
		}
		cout << endl;
	 }
}
wordt ik direct geconfronteerd met divr. fout meldingen.
vooral dat de "while" identifier en de "iss" en "istringstream" nu een undeclared identifier hebben is mij onduidelijk
wie kan mij meer duidelijkheid verschaffen
 
In principe hoort het inlezen en tonen van de data gewoon bij je klasse, toch? Dan lijkt het me een nettere oplossing om gewoon een klasse aan te maken (bijvoorbeeld Coordinates) en deze de istream en ostream operator te laten overloaden voor het inlezen en tonen van de data. Een mogelijke uitwerking hiervan zou het onderstaande kunnen zijn:

coordinates.txt:
[cpp]
HUIS1
36
1.00000 0.00000
0.99964 0.00080
0.99845 0.00126
0.98673 0.00264
0.97742 0.12332
1.00000 0.00000
0.99964 0.00080
0.99845 0.00126
0.98673 0.00264
0.97742 0.12332
1.00000 0.00000
0.99964 0.00080
0.99845 0.00126
0.98673 0.00264
0.97742 0.12332
1.00000 0.00000
0.99964 0.00080
0.99845 1.12322
[/cpp]

Coordinates.h:
[cpp]
#ifndef COORDINATES_H
#define COORDINATES_H

#include <iomanip>
#include <ostream>
#include <istream>

#include <vector>
#include <string>

class Coordinates {
private:
static const unsigned int PRECISION = 5;

std::string name;
size_t size;
std::vector<float> coordinates;
public:
Coordinates();
virtual ~Coordinates();

std::string getName() const;
size_t getSize() const;
std::vector<float> getCoordinates() const;

friend std::eek:stream &operator<<(std::eek:stream &output, const Coordinates &C);
friend std::istream &operator>>(std::istream &input, Coordinates &C);
};

#endif // COORDINATES_H
[/cpp]

Coordinates.cpp:
[cpp]
#include <cstdio>
#include "Coordinates.h"

Coordinates::Coordinates() {
//ctor
}

Coordinates::~Coordinates() {
//dtor
}

std::string Coordinates::getName() const {
return name;
}

size_t Coordinates::getSize() const {
return size;
}

std::vector<float> Coordinates::getCoordinates() const {
return coordinates;
}

std::eek:stream &operator<<(std::eek:stream &output, const Coordinates &C) {
output << "Naam: " << C.name << std::endl
<< "Aantal coordinaten: " << C.size << std::endl
<< std::endl << std::fixed << std::setprecision(Coordinates::pRECISION);

for (size_t idx = 0, id = 1; (idx + 1) < C.coordinates.size(); idx += 2, ++id) {
output << "XB(" << std::setw(2) << std::fixed << id << ") = " << C.coordinates[idx]
<< "\tYB(" << std::setw(2) << std::fixed << id << ") = " << C.coordinates[idx + 1]
<< std::endl;
}

return output;
}

std::istream &operator>>(std::istream &input, Coordinates &C) {
input >> C.name >> C.size;

float temp;
for (size_t idx = 0; idx < C.size; ++idx) {
input >> temp;
C.coordinates.push_back(temp);
}

return input;
}
[/cpp]

main.cpp:
[cpp]
#include <iostream>
#include <fstream>

#include "Coordinates.h"

const char *INPUT_FILE = "c://test//coordinates.txt";

int main() {
Coordinates coordinates;
std::ifstream in(INPUT_FILE);

in >> coordinates;
in.close();

std::cout << coordinates;
return 0;
}
[/cpp]
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan