【QIUC】第一卷-CC++高级(十二)- 关于sscanf_s的使用出现的问题总结

【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;
}

说明:

  1. s << “name:” << name << “\t\tage:” << age << endl;这样是可以格式化的
  2. s << “name:” << name << “\tage:” << age << endl;这样也是可以格式化的
  3. 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;
}

说明:

  1. 注意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对应的是nameage对应的是age这里必须一一对应相等,也就是所谓的格式化,这里为了对应文件中的格式,所以红字中间没有符号,是一个空格。这里有几种错误情况:

    1. name改为其他不一样的字符串,即使字符的个数相同,也是不能格式化读取的
    2. "name:%s age:%d"这中间使用的不是空格(制表符)或者无符号,而使用类似逗号什么的,不能格式化读取。
  2. 这里主要是看流向文件的是什么格式,所对应sscanf_s也就必须是是什么格式如:s << name<<" "<< age << endl; 那么这里对应的要写sscanf_s(line.c_str(), “%s %d”, name, sizeof(name),&age);

  3. 使用line.c_str()是由于line是字符串,是C++特有 的,而sscanf_sC语言的,所以这里要将他转换为C语言的字符串。

  4. sscanf_s(line.c_str(), “name:%s age:%d”, name, sizeof(name),&age); age后面不需要加大小是因为系统会自动识别。将数据读入到以某个内存地址(起始的长度为格式控制字符串给定的数据类型长度)对应的连续内存空间内。所以需要对age加取地址符&

猜你喜欢

转载自blog.csdn.net/qq_51672565/article/details/115451050