我想制作一个解析器,它从 txt 文件文件中读取一行,例如:
INDORE|NJ|201568|A|
UJJAIN|AB|3458|B|
它们是一次读取一行的任何内置函数...通过格式说明符捕获对应变量中的值..但通过| 分隔符分隔值。
parser(str,'|',"%S|%S|%S|%S",location,name,phno,tok);
location, name,...等是变量。
我在 matlab 中找到了一个函数“ strread ”,它可以做这种事情。
假设str是一个流,因为你所有的变量看起来都是字符串,你可以简单地使用std::getlinewith'|'作为分隔符。
std::getline(str, location, '|');
std::getline(str, name, '|');
std::getline(str, phno, '|');
std::getline(str, tok, '|');
您甚至可以将其包装到一个可变参数模板函数中,该函数接受您想要读取的所有参数。
void readParams(std::istream& stream, char delim)
{
}
template<typename ... Tail>
void readParams(std::istream& stream, char delim, std::string& string, Tail& ... t)
{
std::getline(stream, string, delim);
readParams(stream, delim, t ...);
}
然后可以这样调用此函数:
readParams(str, '|', location, name, phno, tok);
如果您被限制使用没有可变参数模板的编译器,您仍然可以为所需的参数数量添加一些重载,并在稍后阶段将它们替换为真正的可变参数模板。
可能更舒服一点...输入文件是 a|b|c|
#include <stdio.h>
int main ()
{
char str1 [80] = {0};
char str2 [80] = {0};
char str3 [80] = {0};
FILE * pFile;
pFile = fopen ("a.txt","r");
fscanf(pFile, "%[^|]|%[^|]|%[^|]|", str1, str2, str3);
fclose (pFile);
return 0;
}
编辑:我确实误读了管道的感叹号..
输入文件是 a|b|2|
char str1 [80] = {0};
char str2 [80] = {0};
int i;
fscanf(pFile, "%[^|]|%[^|]|%d|", str1, str2, &i);