我读了一个文件,并将其内容存储到字符串数组中。
我需要更改一些数值,由编译器解释为字符。
该文件的格式为:ABCDE,EFGHIJ KLMNOPQRS,45.58867,122.59750
我已经搜索过并研究过但没有太过全面。
如果有人可以告诉我该怎么做,我会很高兴。
我不允许使用strtod;我认为这是一个C函数,我的程序只需要严格的C ++。
这是我迄今为止开发的代码:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <sstream>
using namespace std;
int main()
{
string usrFileStr,
fileStr = "airNames.txt", // declaring an obj string literal
sBuffer,
sLine = "";
istringstream iStrStrm;
int lineCount = 1;
int nStart;
fstream inFile; // declaring a fstream obj
// cout is the name of the output stream
cout << "Enter a file: ";
cin >> usrFileStr;
inFile.open( usrFileStr.c_str(), ios::in );
// at this point the file is open and we may parse the contents of it
while ( getline ( inFile, sBuffer ) && !inFile.eof() )
{
nStart = -1 ;
cout << "First Str " << lineCount << " (";
for ( int x = nStart + 1; x < sBuffer.length(); x++ )
{
if ( sBuffer[ x ] == ',' )
{
nStart = x;
break;
}
cout << sBuffer[ x ];
}
cout << ") ";
for ( int x = nStart + 1; x < sBuffer.length(); x++ )
{
if ( sBuffer[ x ] == ',' )
{
nStart = x;
break;
}
cout << sBuffer[ x ];
}
cout << " (Second Str: "; // lattitude loop
for ( int x = nStart + 1; x < sBuffer.length(); x++ )
{
if ( sBuffer[ x ] == ',' )
{
nStart = x;
break;
}
cout << sBuffer[ x ];
}
cout << ", Third String: ";
for ( int x = nStart + 1; x < sBuffer.length(); x++ )
{
if ( sBuffer[ x ] == ',' )
{
nStart = x;
break;
}
cout << sBuffer[ x ];
}
cout << ") \n";
lineCount++;
}
cout << "There are a Total of: " << lineCount << " line(s) in the file."
<< endl;
inFile.clear(); // clear the file of any errors
inFile.close(); // at this point we are done with the file and may close it
fgetc( stdin );
return 0;
}
我试过只读小数后的两位数,但我只得到一个字符。 我的第一次尝试是使用static_cast,但现在已经过时了。 而一个istringstream变量不会让它的参数成为一个数组。我不知道该怎么做..
答案 0 :(得分:3)
学会喜欢它。不是istringstream,因为你想从它获得输出。类似的东西:
getline ( inFile, sBuffer );
stringstream myStream(sBuffer);
string first, second, third;
char comma;
myStream >> first;
myStream >> second;
myStream >> third;
float value1, value2;
myStream >> value1;
myStream >> value2;
另外,我建议您检查以确保文件实际打开。
答案 1 :(得分:1)
你想要stringstream,但是......
顺便说一句,在C ++程序的上下文中忽略C函数是愚蠢的。大多数OS函数都将作为C函数导出,而且C ++本身通常(总是?)编译成相当于C代码的东西,所以没有任何东西只能粘贴到C ++构造/函数上。一定要在适当的时候使用C ++提供的更高级别的抽象和方法,但如果你试图避免所有的C-linkage功能,那么你就没有充分的理由伤害自己。用什么有用;真正的编程很难,而不会超越自我限制。
当然,以上仅适用于现实世界的编程;家庭作业等可能是例外。 :)
答案 2 :(得分:0)
您也可以尝试使用boost regex, 请参阅:http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/captures.html
这样你就可以为','char添加一个reqex并捕获其中的值,甚至可以验证它们......
祝你好运!答案 3 :(得分:0)
使用string.find()可以摆脱一些循环(它可能只在内部完成,但不需要重新发明轮子)。您可以使用字符串流将数字字符串转换为浮点数或双精度数。
答案 4 :(得分:0)
使用提升精神(http://www.boost.org/doc/libs/1_37_0/libs/spirit/classic/index.html)。花一点时间习惯,但如果你了解它就非常强大和有用。