我需要读一个* .txt文件。它包含单词和数字,它看起来像这样:
firstword:12,13.0secondword18.7thirdword2,3,89
我需要将单词提取为字符串,将数字提取为浮点数。我无法解决的主要问题是之前没有分隔符#34;单词" (否则我会使用getline)。
谢谢!
注意:单词不包含数字,例如,单词' num1'是不可能的。
答案 0 :(得分:0)
使用text.txt
时,通常需要分隔符,文件中没有分隔符。
通过使用标准c库中的函数,您可以逐个字符地执行此操作,而无需使用分隔符。它并不优雅。
这是从文本文件firstword:12,13.0secondword18.7thirdword2,3,89
提取isalpha()
中提取单词和双打的一种方法。
此解决方案使用功能extractedWords[]
提取任何与字母相关的内容,并将其存储在数组isdigit()
中。
对于双打,它使用atof()
和extractedDoubles[]
提取任何相关数字,并将其存储在数组#include<string>
#include<fstream>
#include<iostream>
#include <stdlib.h>
using namespace std;
char mainBuffer[1024]={' '};
size_t fsize ;
string extractedWords[100];
double extractedDoubles[100]={0};
string buf2str(const char* buffer);
void loadFileToBuffer(char *filename);
void extractWords();
void extractFloats();
int main(){
loadFileToBuffer("text.txt" );
extractWords();
extractFloats();
cout<<"\n";
return 0;
}
string buf2str(const char* buffer){
return string(buffer);
}
void loadFileToBuffer(char *filename){
ifstream infile;
infile.open(filename);
infile.read(mainBuffer, sizeof mainBuffer);
if (infile.eof()){
fsize = infile.gcount();
cout<<"fsize = "<<fsize<<" , data = " << mainBuffer <<" \n ";
}
else if (infile.fail()){
// some other error...
}
else{
// buf must be full, but the file is larger...
}
infile.close();
}
void extractWords(){
char character;
int i=0;
int j=0;
char shortBuffer[16]={' '};
int seek=0;
cout<<"\n";
seek=0;
i=0;
j=0;
while ( seek<=fsize ) {
character=mainBuffer[seek];
if ( isalpha(character) ) {
shortBuffer[i]=character;
i++;
}
else{
shortBuffer[i]='\0';
if (strlen(shortBuffer)>2){
extractedWords[j]=buf2str(shortBuffer);
i=0;
j++;
}
}
seek++;
}
for(int ii=0;ii<j;ii++) cout<<extractedWords[ii] <<"\n";
cout<<"\n";
}
void extractFloats(){
char character;
int i=0;
int j=0;
char shortBuffer[16]={' '};
double dValue=0;
int seek=0;
cout<<"\n";
seek=0;
i=0;
j=0;
while ( seek<=fsize ) {
character=mainBuffer[seek];
if ( isdigit(character) || character=='.' ){
shortBuffer[i]=character;
i++;
}
else{
shortBuffer[i]='\0';
dValue=atof(shortBuffer);
if (dValue != 0) {
extractedDoubles[j]=dValue;
j++;
i=0;
}
}
seek++;
}
for(int ii=0;ii<j;ii++) cout <<extractedDoubles[ii]<<"\n";
cout<<"\n";
}
中。
{{1}}