954,499 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

searching a string, converting atof, replacing some doubles, and writing to an array

Hey everyone,
I am working on a function that reads a text file (portion below) of data points arranged in two columns and stores the numbers only in an array of signal[2500][2]. The problem is, I need to do some search and replace on some of the data points. Some are mV and msec, while others are uV and usec. As there are negative signs on some values, I cannot simply choose the first six places in each line (or similar). My intent is to convert those lines that are mV and ms to uV and usec and then store all the values in the signal array. However, I'm getting a few error messages and would like some feedback on how to fix them. They are listed at the bottom.

The more I look at this, the more I'm not sure I should be using strtok, or I'm not using it the right way. I know it needs to accept a 'const char *' but I'm blanking on what to send it.

An outline of my thought process:Use a while loop to read each line until EOF
Define each line as string1
Tokenize string 1 after the character 's'
Use if statements to determine whether a 'm V' or 'm s' is present in the string
Convert string1 to a double using atof().
If conversion is needed, do it. If not, do nothing. Store new value as newValue.
Use two for loops to cycle through the array columns and rows and populate each with newValue.

A snippet of the text file is here. There are 2501 lines total, the first being simply a header line.
-1.0060m s 112.00m V
-1.0040m s 112.00m V
-1.0020m s 116.00m V
-1.0000m s 116.00m V
-998.00u s 120.00m V
-996.00u s 120.00m V
-994.00u s 124.00m V

My code for the function is here:
Relevant header files:

#include <iostream>
#include <cstring>
#include <fstream>
#include <cmath>
#include "spectrum.h"
using namespace std;

Relevant parameters defined in header file:

char* header, lineData[100];
	char* string1;
	char string2;
	double voltage, secondage, newValue;
        float signal[2500][2];

The function:

void Spectrum::searchReplace(ifstream &inFile)
{
	inFile.getline(header, 99);				//gets first header line and does nothing with it.  now "pointer" is at second line
	while (!inFile.eof()) 
	{
		string1 = inFile.getline(lineData,99); //Note 1
		strtok(string1, 's');//Note 2
		if(strchr(string1,'m V'))
			atof(string1)=voltage;//Note 3
			newValue=voltage*1000;
		if(strchr(string1, 'm s'))
			atof(string1)=secondage; //Note 3 (again)
			newValue=secondage*1000;
		else //Note 4
			atof(string1)=newValue;
		for(i=0;i<=2499;i++)
			for(j=0;j<=1;j++)
				signal[i][j]=newValue;
	}


Note 1: inFile is underlined in red because 'no suitable conversion from 'std::basic_istream>' to 'char *' exists"
Note 2: 's' is underlined because "argument of type 'char' is incompatible with parameter of type 'const char *'"
Note 3: atof is underlined in red because it says "the expression must be a modifiable value"
Note 4: "error: expected a statement"

Thanks for your help.

engineerchica
Newbie Poster
19 posts since Jan 2012
Reputation Points: 10
Solved Threads: 0
 

Something tells me the problem comes in with the first error (ie when you solve that it might take the others away as it seems to be a chain taking place in the order they reference each other)

I do not carry much knowledge on "std::basic_istream>" type coding as I use external variables for my programs, however that second error I would know anyplace

What it is telling you is that you are trying to use a char variable where a pointer to a char variable is expected

in other words if you create something like the following it should solve that:

char* sString = new char();
sString = 's';
strtok(string1, sString);//strtok(string1, 's');
Eagletalon
Junior Poster
113 posts since Mar 2011
Reputation Points: 47
Solved Threads: 13
 

using the same logic it might mean that you need to load the "lineData" variable into a char* as well and change the string in the same way... it MIGHT work... wont hurt to try I guess?

Eagletalon
Junior Poster
113 posts since Mar 2011
Reputation Points: 47
Solved Threads: 13
 

Thanks, Eagletalon, your thoughts make sense to me. However, I'm now getting a new "error" in this area. Any thoughts? I must be mixing up my char * and char.

Here is my new function. There is a new error on the line with Note 1. The atof function errors remain as does the inFile error.

void Spectrum::searchReplace(ifstream &inFile)
{
	inFile.getline(header, 99);				//gets first header line and does nothing with it.  now "pointer" is at second line
	while (!inFile.eof()) 
	{
		string1 = inFile.getline(lineData,99);	 
		char* sString = new char();	
		sString = 's'; //Note1
		strtok(string1, sString);					
												
		if(strchr(string1,'m V'))
			atof(string1)=voltage;				
			newValue=voltage*1000;
		if(strchr(string1, 'm s'))
			atof(string1)=secondage;			
			newValue=secondage*1000;
		else									
			atof(string1)=newValue;
		for(i=0;i<=2499;i++)
			for(j=0;j<=1;j++)
				signal[i][j]=newValue;
	}
	cout<<endl<<signal[i][j]<<endl;

	inFile.close()
}


Note 1: The equal sign is underlined in red, because, "A value of type 'char' cannot be assigned to an entity of type 'char *'"

engineerchica
Newbie Poster
19 posts since Jan 2012
Reputation Points: 10
Solved Threads: 0
 

Certainly looks self-explanatory to me. You can't make a char* (sString array) equal to a single character ('s')

If you think you "must be mixing up my char * and char" then look at the statements in question and verify it. Why ask if that's what you think and waste an hour waiting for us to confirm and spoon feed an answer?

WaltP
Posting Sage w/ dash of thyme
Moderator
10,506 posts since May 2006
Reputation Points: 3,348
Solved Threads: 944
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You
View similar articles that have also been tagged: