Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;如何读取txt文件并检索除字符串以外的数值(反之亦然) 我一直在自学C++,并在寻找如何做到这一点。让我举个例子来说明我的意图_C++_Fstream_Ifstream - Fatal编程技术网

C++;如何读取txt文件并检索除字符串以外的数值(反之亦然) 我一直在自学C++,并在寻找如何做到这一点。让我举个例子来说明我的意图

C++;如何读取txt文件并检索除字符串以外的数值(反之亦然) 我一直在自学C++,并在寻找如何做到这一点。让我举个例子来说明我的意图,c++,fstream,ifstream,C++,Fstream,Ifstream,这是一个txt文件,内容如下 Matt 18 180.0 88.5 Angela 20 155.5 42.2 每一行都有关于一个人的姓名、年龄、身高和体重的信息 我一直试图做的是分别获取这4种类型的信息,并根据信息类型将它们存储在不同的变量中 vector<string> name; //"Matt" or "Angela" are stored here. vector<int> age; //18 or 20 vector<double>

这是一个txt文件,内容如下

Matt   18  180.0   88.5
Angela 20  155.5   42.2
每一行都有关于一个人的姓名、年龄、身高和体重的信息

我一直试图做的是分别获取这4种类型的信息,并根据信息类型将它们存储在不同的变量中

vector<string> name; //"Matt" or "Angela" are stored here.
vector<int> age; //18 or 20
vector<double> height; //The same logic goes for this vector and the next one
vector<double> weight;
向量名//“马特”或“安吉拉”存储在这里。
媒介年龄//18或20岁
矢量高度//同样的逻辑适用于这个向量和下一个向量
向量权重;
至少我发现,通过使用
ifstreamObject.open(filename.c_str())
getline(ifstreamObject,string)
,txt文件中的信息可以存储在字符串变量中。然而,通过使用这个方法,我只能得到对应于每一行的字符串值。换句话说,我无法区分字符串值和数值

很可能没有其他方法从txt文件中获取信息。尽管如此,以防万一,在我放弃之前,我想在这里就如何以这种方式获取信息征求一些建议


任何建议都将不胜感激。

如果您知道每个条目之间有一个特定的字符(如制表符),您可以使用String.find_first_和substring将字符串划分为多个片段,并将其解析为您拥有的字段。
检查更多信息

您好,您可以使用stl::string方法操作行字符串,以分别提取这4种类型的信息

用于查找每个空白字符的开头,并用于查找每个非空白字符。用于从行字符串中提取子字符串。还可以使用
atoi
将字符串值转换为int

比如说,

//rowSrting保存文件中一行的数据

std::size_t nameEnd = rowString.find_first_of(" ");
string name = rowString.substr(0, nameEnd-1);

std::size_t ageFirst = rowString.find_first_not_of(" ", nameEnd);
std::size_t ageEnd = rowString.find_first_of(" ", ageFirst );
int age = atoi(rowString.substr(ageFirst, ageEnd-1));

您可以直接使用流

std::string name;
int age;
double height, weight;

while(ifstreamObject >> name >> age >> height >> weight)
{
    // process name, age, height and weight
}
缺点是流插入操作符将一直读取到第一个空格。因此,如果要将整行作为字符串读取,则使用
getline
,相应地处理该字符串,“映射”将
getline
读取的字符串返回到
istringstream

std::istringstream is(str); // constructs an istringstream from the string str

然后使用
与使用流类似。

非常感谢。我能再问一个问题吗?
>
操作符显然根据是否有空格来分隔每个字符串块(在上面的示例中,每个字符串块可以是“Matt”、“18”、“180.0”等等)。我还认为我需要在
>
之间放置一个变量名,以便检测每个字符串块。我说得对吗?谷歌搜索
c++ifstream>>操作符
显示与
c++istream>>操作符
相关的结果,而不是
ifstream
@YMD是的,这是正确的。提取运算符继承自
istream
(它是
ifstream
的基类)。