WIndows下 C++ 从文件中读取数据

背景:WIndows下利用C++ 从文件中读写内容

1、使用fscanf语句

#include 
#include 

std::FILE *fp;
fp = fopen(filePath.c_str(), "r");
if (!fp ) {
	printf("Cann't open input  csv file: %s\n", filePath);
	return 0;
};
std::map NoNameMap;
fscanf(fp, "%s,%s,%s", &a, &b, &c);
printf("%s %s %s\n", a, b, c);
while (1){
    std::string first, second,temp;
	fscanf(fp, "%s,%s,%s", &first, &second, &temp);
	printf("%s %s %s\n", first, second,temp);
	NoNameMap.insert(std::pair(first, second));
	if(feof(fp)) //判断是否到文件结尾
		break;
}	
fclose(fp);

注意:执行到 NoNameMap.insert 这一步。总是出现异常:内存错误 std::bad_alloc,目前没有解决方法

2、使用getLine函数

std::ifstream f(filePath);
	std::string csvLine;
	getline(f, csvLine);//第一行表头不做统计
	while (getline(f, csvLine))
	{
		std::istringstream csvStream(csvLine);
		std::vector csvColumns;
		std::string csvElement;
		// 从逗号分隔的行中读取每个元素并把它转化为向量或字符串
		while (getline(csvStream, csvElement, ','))
		{
			csvColumns.push_back(csvElement);
		
		};
		std::string str1 = csvColumns[0].substr(1, csvColumns[0].size()-2),
			str2 = csvColumns[1].substr(1, csvColumns[1].size() - 2);//去掉两端的引号
		NoNameMap.insert(std::pair(str1, str2));
	}

 

你可能感兴趣的:(C++)