C ++不是我的首选语言。
我有一个包含此文件的文件:
e 225,370 35,75
我想将e,225,370,35和75彼此分成char和ints,但我遇到了麻烦。我尝试了在网上和我的C ++书中找到的所有内容,但仍然无法解决问题。请帮忙。
我会更容易用Java做这件事。
答案 0 :(得分:13)
C++ String Toolkit Library (StrTk)针对您的问题提供了以下解决方案:
int main() { std::string data("e 225,370 35,75"); char c1; int i1,i2,i3,i4; strtk::parse(data,", ",c1,i1,i2,i3,i4); return 0; }
可以找到更多示例Here
答案 1 :(得分:4)
如果您可以控制格式,如果您删除了逗号,那么它(稍微)会更容易阅读,只需输入
e 225 370 35 75
使用这种格式,Poita_用于读取数据的代码将起作用[编辑:他自从更新他的代码以明确阅读并跳过逗号]。否则,您需要明确地跳过逗号:
char ingore1, ignore2;
char ch;
int i[4];
file >> ch >> i[0] >> ignore1 >> i[1] >> i[2] >> ignore2 >> i[3];
[编辑:如果您是偏执或真的需要验证您的输入,此时您可以检查ignore1
和ignore2
是否包含逗号。]
但是,在大多数情况下,数据可能是相关的,因此您需要将整行读入单个结构(或类)中:
struct data {
char ch;
int i[4];
std::istream &operator>>(std::istream &is, data &d) {
char ignore1, ignore2;
return is >> ch >> i[0] >> ignore1 >> i[1] >> i[2] >> ignore2 >> i[3];
}
};
完成此操作后,您可以一次读取整个data
对象:
std::ifstream infile("my data file.txt");
data d;
infile >> d;
或者,如果您有一个完整的文件,您可以将它们全部读入矢量:
std::vector<data> d;
std::copy(std::istream_iterator<data>(infile),
std::istream_iterator<data>(),
std::back_inserter(d));
答案 2 :(得分:3)
如果要使用旧式C运行时
FILE * pf = fopen(filename, "r");
char e;
int a, b, c, d;
int ii = fscanf(pf, "%c %d,%d %d,%d", &e, &a, &b, &c, &d);
if (ii < 5)
printf("problem in the input file");
fclose (pf);
编辑:根据来自 dreamlax
的评论添加错误检查答案 3 :(得分:2)
假设您已将数据读入字符串......
你还需要什么?
答案 4 :(得分:2)
#include <fstream>
/* ... */
ifstream file;
file.open("yourfile.txt");
char c, dummy;
int i[4];
file >> c >> i[0] >> dummy >> i[1] >> i[2] >> dummy >> i[3];
file.close();
答案 5 :(得分:2)
使用Boost Tokenizer分割字符串。我假设只有第一个令牌是char,所以示例代码如下:
#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>
#include <vector>
using namespace std;
...
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
string teststring("e 225,370 35,75");
boost::char_separator<char> separators(", ");
tokenizer tokens(teststring, separators);
vector<string> substrings;
for (tokenizer::iterator iter = tokens.begin(); iter != tokens.end(); ++iter)
{
substrings.push_back(*iter);
}
并且,瞧,你有一个整齐的矢量中的所有子串。 char在子字符串[0]中作为std :: string,并且以下int值在子字符串[1]和后面的那些中,也作为std :: string。您需要将它们转换为整数值。为此我建议你看看stringstream。
答案 6 :(得分:-2)
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f("a.txt"); // check for errors.
char ch,dummy;
int i1,i2,i3,i4;
f>>ch>>i1>>dummy>>i2>>i3>>dummy>>i4;
cout<<ch<<endl<<i1<<endl<<i2<<endl<<i3<<endl<<i4<<endl;
return 0;
}