【QIUC】第一卷-C/C++高级(十二)- 关于sscanf_s 在文件读写中出现的问题总结
函数使用
sscanf (const char *str,const char * format,…),sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。
源代码
对文件的格式化写
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
string name;
int age;
ofstream file;
file.open("user.txt", ios::out | ios::trunc);
while (1) {
cout << "请输入姓名: [ctrl+z退出] ";
cin >> name;
if (cin.eof()) {
break;
}
cout << "请输入年龄: ";
cin >> age;
stringstream s;
s << "name:" << name << "\t\tage:" << age << endl;
file << s.str();
}
file.close();
system("pause");
return 0;
}
说明:
- s << “name:” << name << “\t\tage:” << age << endl;这样是可以格式化的
- s << “name:” << name << “\tage:” << age << endl;这样也是可以格式化的
- s << “name:” << name<<"\t" << “age:” << age << endl;这样的话,如果姓名太长的话,则对不齐
对文件的格式化读
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <Windows.h>
using namespace std;
int main(void)
{
char name[32];
int age;
string line;
ifstream file;
file.open("user.txt");
while (1) {
getline(file, line);
if (file.eof()) {
break;
}
sscanf_s(line.c_str(), "name:%s age:%d", name, sizeof(name),&age);
cout << "姓名:" << name << "\t\t年龄:" << age << endl;
}
file.close();
system("pause");
return 0;
}
说明:
-
注意s << “name:” << name << “\t\tage:” << age << endl;说明最后在文件中显示的应该是:
name:xxxx(两个制表符)age:xxxx
name:xxxx(两个制表符)age:xxxx
而sscanf_s的使用是:
sscanf_s(line.c_str(), “name:%s age:%d”, name, sizeof(name),&age);
注意红字,在这里name对应的是name,age对应的是age,这里必须一一对应相等,也就是所谓的格式化,这里为了对应文件中的格式,所以红字中间没有符号,是一个空格。这里有几种错误情况:
- name改为其他不一样的字符串,即使字符的个数相同,也是不能格式化读取的
- "name:%s age:%d"这中间使用的不是空格(制表符)或者无符号,而使用类似逗号什么的,不能格式化读取。
-
这里主要是看流向文件的是什么格式,所对应sscanf_s也就必须是是什么格式如:s << name<<" "<< age << endl; 那么这里对应的要写sscanf_s(line.c_str(), “%s %d”, name, sizeof(name),&age);
-
使用line.c_str()是由于line是字符串,是C++特有 的,而sscanf_s是C语言的,所以这里要将他转换为C语言的字符串。
-
sscanf_s(line.c_str(), “name:%s age:%d”, name, sizeof(name),&age); age后面不需要加大小是因为系统会自动识别。将数据读入到以某个内存地址(起始的长度为格式控制字符串给定的数据类型长度)对应的连续内存空间内。所以需要对age加取地址符&。