首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

stringstream丢失第一个字符解决方案

2012-03-17 
stringstream丢失第一个字符操作系统课的一个作业上,有个功能让我们读一个格式固定的文件,并把其中的内容

stringstream丢失第一个字符
操作系统课的一个作业上,有个功能让我们读一个格式固定的文件,并把其中的内容解析,存入一个结构体里(这个结构体需要先被加入到共享内存中,不过这不是重点)。我使用getline函数将文件一行一行读入字符串中,再用stringstream将这个字符串分解成一个个单词,分别存入结构体里,结果有一个单词的首字母就被丢掉了。

所要读的文件(Metadata.txt)内容如下:

2
EMPLOYEE.txt
EMPLOYEE 3
ID NAME ADDRESS
WORKS_FOR.txt
WORKS_FOR 2
ID DEPARTMENT

程序如下:

  struct Database *dbptr; //要存入的结构体

  ifstream i_file;
  string s = "";
  i_file.open("Metadata.txt");
  if (i_file.is_open()) {
  getline(i_file, s);
  stringstream ss(s);
  ss >> dbptr->t_num; // dbptr是定义的结构体,t_num是其中一个属性,这行代码负责读入文件中第一行的词,即2,没有问题。
  for (int k = 0; k < dbptr->t_num; k++) {
  getline(i_file, s); //将文件的一行读入字符串s
  strcpy(dbptr->tfName[k], s.c_str()); //这行将第二行的文件名读入,即EMPLOYEE.txt, 也没有问题。
  getline(i_file, s);
  /*

  下面这行代码(s=" "+s;)是不得已加的,因为如果不加的话,待会儿读入的dbptr->tName[k](k=0时)将是MPLOYEE,丢了第一个字母E。

  但后面一切读入的都很正常,WORKS_FOR也不会变成ORKS_FOR, 令我百思不得其解。
  */
  s=" "+s;//不得已而加之的代码
  ss.clear(); //清空stringstream里的内容,准备重新加载数据
  ss << s;
  ss >> dbptr->tName[k]; //将第三行第一个单词,即EMPLOYEE读入结构体,问题出现处!!
  ss >> dbptr->employee[k].f_num; ////将第三行第二个单词,即3读入结构体,没有问题
  getline(i_file, s);
  ss.clear();
  ss << s;
  for (int l = 0; l < dbptr->employee[k].f_num; l++)
  ss >> dbptr->employee[k].fName[l]; //分别读入第四行的三个单词 没有问题

  }

附结构体里的相关变量:

struct Database {
  struct Employee employee[3];
  int t_num;
  char tfName[3][20];
  char tName[3][20];
  int readcount;
   
};

请问为什么不加那行代码( s=" "+s;)就会丢掉EMPLOYEE的第一个字符E?

[解决办法]
单步调试下。另外,用个可以16进制查看的编辑器打开文本,看看是不是文本里含有什么奇怪的值
[解决办法]

探讨

楼主,这样就行了:

在语句
ss.clear(); //清空stringstream里的内容,准备重新加载数据

下面增加一句:

ss.str("");

即可

热点排行