fscanf无法正常使用字符串

时间:2015-05-04 16:20:02

标签: c++ string scanf

我的应用程序有一个简单的问题。 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",&currentName[0],&currentAge,&currentSalary);
        ptr=new Worker(currentName,currentAge,currentSalary);
        ptr->showVaulues();
    }
    system("pause");
}

2 个答案:

答案 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