我的应用程序有一个简单的问题。 fscanf
收集整个单词,但大小(长度)等于默认大小currentName
。如果currentName
的默认长度值低于单词的长度,则单词将被剪切。
例如:
如果currentName
=“123”
然后
fscanf
将返回“Art”而不是“Arthur”。
或
如果currentName
=“123456789”,则fscanf
将返回“Arthur 89”而不是“Arthur”。
文件“list.txt”包含行:
Arthur 30 1550
Ben 32 2100
Charlie 25 1850
Danny 46 2400
Edward 35 2750
我应该改变什么来解决这个问题?我必须使用fscanf而不是fstream。
#include <iostream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
using namespace std;
class Worker
{
private:
string name;
int age;
double salary;
public:
Worker()
:name(""),age(99),salary(0)
{}
Worker(string name, int age, double salary)
:name(name),age(age),salary(salary)
{}
void showVaulues()
{
cout<<endl;
cout<<"Name:\t"<<name<<endl;
cout<<"Age:\t"<<age<<endl;
cout<<"Salary:\t"<<salary<<endl;
}
};
int main()
{
FILE *myfile=NULL;
string currentName="123456789";
int currentAge=0;
double currentSalary=999999;
Worker *ptr=NULL;
myfile=fopen("list.txt","r");
while (feof(myfile) == 0)
{
fscanf(myfile,"%s %d %lf\n",¤tName[0],¤tAge,¤tSalary);
ptr=new Worker(currentName,currentAge,currentSalary);
ptr->showVaulues();
}
system("pause");
}
答案 0 :(得分:1)
您无法在此处尝试直接修改std::string
的内部缓冲区。要阅读string
,请使用信息流:
std::ifstream in ("list.txt");
int >> currentname >> currentAge >> currentSalary;
如果您确实需要使用fscanf
,请使用足够大的std::vector<char>
并将其用作C风格的字符串。
答案 1 :(得分:1)
scanf
将%s
扫描到char
数组,而不是std::string
。
std::string
使用struct { size_t length; char* buffer; }
之类的内容实现,因此写入buffer
实际上会更改字符串。但是,由于它明确地跟踪其长度,因此字符串末尾的'\0'
不会被视为终结符,就像在字符数组字符串中一样。
你可以只扫描到char
数组,但C ++的方法是使用std::ifstream
。