gpt4 book ai didi

c++ - fscanf 不能正确处理字符串

转载 作者:行者123 更新时间:2023-11-28 02:27:30 24 4
gpt4 key购买 nike

我的应用程序有一个简单的问题。 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");
}

最佳答案

scanf%s 扫描到 char 数组中,而不是 std::string

std::string 是用 struct { size_t length; 之类的东西实现的。字符*缓冲区; },所以写入 buffer 实际上会改变字符串。但是,由于它明确地跟踪其长度,因此字符串末尾的 '\0' 不会像在字符数组字符串中那样被视为终止符。

您可以只扫描到一个 char 数组,但 C++ 风格的方法是使用 std::ifstream

关于c++ - fscanf 不能正确处理字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30034899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com