View Full Version : read from txt file C++
fbitonti 12-28-2006, 03:22 AM I have a series of integers in a text file that I need to import and store in 'int' and 'float' variable. So far I have been able to import these values as std::string variables but need to convert them and don't know how. if this is a lame question I am new to c++ and would appreciate any help that you can give me.
// Declare the necessary variables.
std::string line;
// Define a file object.
std::ifstream fileInput("C:/2dTrussMaterials.txt");
// std::string material[3];
// int matQuery = 0;
// // Read in all data.
// while (std::getline(fileInput, line, '|')) { // Reads in a quote.
//
// // Print the quote.
// std::cout << line << "\n - ";
//
// // Get and print the speaker.
// std::getline(fileInput, material[matQuery]);
// std::cout << line << "\n\n";
//
// matQuery = matQuery+1;
//
// } // End of WHILE.
//
// // Close the stream.
// fileInput.close();
//
// //E modulus of elasticity
// int e = material[0];
//
// //A area of section
// float a = material[1];
|
|
HalfVector
12-28-2006, 09:55 AM
Hi.
Try using the iostream library. Here (http://home.wanadoo.nl/efx/c++-faq/misc-technical-issues.html#faq-39.2) you have an example.
AzHisoka
12-29-2006, 07:29 PM
So you just want to convert a string to an int? Can't you just do atoi?
fbitonti
12-29-2006, 07:41 PM
I am able to import however, now i'm stuck with a string that i have to convert.
this is a sample of what I am doing. I would like to stick with this method for converting the string I know it can be done other ways but i would like to make this one work for other reasons that come into play later in the program. however, i may be open to other methods if this absolutly will not work.
for some reason when I convert the string into an int or flaot i gives me back a zero can some one tell me what is going on.
the text file that I am reading from has two numbers on two different likes. one is 20000 the other is 40.5
// Declare the necessary variables.
std::string line;
// Define a file object.
std::ifstream fileInput("C:/2dTrussMaterials.txt");
//std::string s = 28383;
//double x = convertToDouble(s);
std::string material[3];
int matQuery = 0;
// // Read in all data.
while (std::getline(fileInput, line, '|')) { // Reads in a quote.
//
// // Print the quote.
// std::cout << line << "\n - ";
//
// // Get and print the speaker.
std::getline(fileInput, material[matQuery]);
// std::cout << line << "\n\n";
//
matQuery = matQuery+1;
//
} // End of WHILE.
//
// // Close the stream.
fileInput.close();
//
int e = atoi(material[0].c_str());
float a = atoi(material[1].c_str());
janimatic
12-29-2006, 10:13 PM
you should use stringstream instead, it provide the same conversion capability as iostreams.
Something like that :
#include <iostream>
int yourIntValue;
std:string yourStringFromGetline;
//while getline etc....
std::istringstream parser;
parser.str(yourStringFromGetline);
parser >> yourIntValue;
//end while
fbitonti
12-30-2006, 12:15 AM
ok this is what i've got now. it spits back different values than what I put into it.
they should be
e= 200000
and a = 4000
instead i get
e= -858993460
a = -858993472
this is the code i'm working with right now.
// Declare the necessary variables.
std::string line;
// Define a file object.
std::ifstream fileInput("C:/2dTrussMaterials.txt");
//std::string s = 28383;
//double x = convertToDouble(s);
int txtmaterial[3];
std::string material[3];
int matQuery = 0;
// // Read in all data.
while (std::getline(fileInput, line, '|')) { // Reads in a quote.
//
// // Print the quote.
// std::cout << line << "\n - ";
std::istringstream parser;
// // Get and print the speaker.
std::getline(fileInput, material[matQuery]);
// std::cout << line << "\n\n";
parser.str(material[matQuery]);
parser >> txtmaterial[matQuery];
matQuery = matQuery+1;
//
} // End of WHILE.
//
// // Close the stream.
fileInput.close();
//
int e = txtmaterial[0];
float a = txtmaterial[1];
I feel like it's getting close to working you will have to excuse me if i am missing a basic step i'm just starting to learn c++ and am teaching myself. I appreciate all the help i can get thanks again
janimatic
12-30-2006, 12:36 AM
could you start by using sinmple int and string before using arrays and pointers, that would probably make it easier to track the problem
fbitonti
12-30-2006, 06:45 AM
i have also been trying to do it this way.
convert.h
// File: convert.h
#include <iostream>
#include <sstream>
#include <string>
#include <stdexcept>
class BadConversion : public std::runtime_error {
public:
BadConversion(const std::string& s)
: std::runtime_error(s)
{ }
};
inline int convertToInt(const std::string& s)
{
std::istringstream i(s);
int x;
if (!(i >> x))
throw BadConversion("convertToInt(\"" + s + "\")");
return x;
}
inline int convertToFloat(const std::string& s)
{
std::istringstream i(s);
float x;
if (!(i >> x))
throw BadConversion("convertToFloat(\"" + s + "\")");
return x;
}
then i use those functions in the main cpp file
#include <stdio.h>
#include <cstdlib>
#include <math.h>
#include <fstream>
#include <string>
#include <iostream>
#include "convert.h"
// Declare the necessary variables.
std::string line;
// Define a file object.
std::ifstream fileInput("C:/2dTrussMaterials.txt");
//std::string s = 28383;
//double x = convertToDouble(s);
int txtmaterial[3];
std::string material[3];
int matQuery = 0;
// // Read in all data.
while (std::getline(fileInput, line, '|')) { // Reads in a quote.
//
// // Print the quote.
// std::cout << line << "\n - ";
std::istringstream parser;
// // Get and print the speaker.
std::getline(fileInput, material[matQuery]);
// std::cout << line << "\n\n";
parser.str(material[matQuery]);
parser >> txtmaterial[matQuery];
matQuery = matQuery+1;
//
} // End of WHILE.
//
// // Close the stream.
fileInput.close();
// //E modulus of elasticity
int e = convertToInt(material[0]);
//
// //A area of section
float a = convertToFloat(material[1]);
I've been at this for days and i'm getting soo confused some one please help me! lol thanks again.
fbitonti
12-30-2006, 06:48 AM
the method in the last post compiles fine with no errors however there seems to be a memory problem because when i run the plugin in maya it dosn't give me any output. at all some error is breaking the commands i know the error is from this portion of code because without this code the plugin works fine.
janimatic
12-30-2006, 09:44 AM
int txtmaterial[3];
std::string material[3];
while (std::getline(fileInput, line, '|')) { // Reads in a quote.
} // End of WHILE.
those are the part of the code i would look for error.
- Could you test without using arrays ???
once it will work fine , and when you need arrays in general you can use a std containers instead : vector .
But i don't see why you need an array of strings ????
Just reuse the same
std::string material;
object for each
std::getline(fileInput, material);
- aint this loop blocking ?
- oh and you are using getline twice !
you should use "line" string variable (make sure it has the expected content by printing it) , convert it to stringstream and get the values from this.
fbitonti
12-30-2006, 04:25 PM
GOT IT! thank soo much every one.
CGTalk Moderation
12-30-2006, 04:25 PM
This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.
vBulletin v3.0.5, Copyright ©2000-2012, Jelsoft Enterprises Ltd.