1

我想制作一个解析器,它从 txt 文件文件中读取一行,例如:

INDORE|NJ|201568|A|
UJJAIN|AB|3458|B|

它们是一次读取一行的任何内置函数...通过格式说明符捕获对应变量中的值..但通过| 分隔符分隔值。

parser(str,'|',"%S|%S|%S|%S",location,name,phno,tok);

location, name,...等是变量。

我在 matlab 中找到了一个函数“ strread ”,它可以做这种事情。

4

2 回答 2

0

假设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);

如果您被限制使用没有可变参数模板的编译器,您仍然可以为所需的参数数量添加一些重载,并在稍后阶段将它们替换为真正的可变参数模板。

于 2013-04-05T05:52:30.897 回答
0

可能更舒服一点...输入文件是 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); 
于 2013-04-05T06:18:10.023 回答