读书人

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

发布时间: 2012-03-17 19:06:28 作者: rapoo

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("");

即可

读书人网 >C++

热点推荐