C++读写文件,vector排序等

C++文件读写时,遇到的问题如下:

// ConsoleApplication1.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<sstream>
#include<fstream>
#include<string>
#include<vector>
#include<algorithm>
#include <functional>
using namespace std;

int main()
{
	int a,b;
	string line;
	ifstream in("num.txt");
	vector<int> var;
	stringstream ss;
	while (getline(in,line))
	{
		ss.clear();
		ss.str(line);
		while(ss>>a)
		{ 
		   var.push_back(a);
		}
	}
	auto max_position=max_element(var.begin(), var.end());
	cout << "max:" << *max_position << "   loc:"<<max_position-var.begin() << endl;
	auto minmax_position = minmax_element(var.begin(), var.end());
	cout << "min:" << *minmax_position.first<< "   loc:" << minmax_position.first - var.begin() <<  "   max:" << *minmax_position.second << "   loc:" << minmax_position.second - var.begin()<<endl;
	sort(var.begin(), var.end(), greater<int>());//greater需要添加头文件#include <functional>,less不需要
	for (auto c : var)
	{
		cout << c << "\t";
	}
	cout << endl;
	ofstream out("num.txt",ofstream::app);//切记要以追加模式,否则会丢失原有数据
	out <<endl<< "666  999";
	out.close();

	in.clear();
	//在原文件后加入新内容后重新显示
	cout << "change after:" << endl;
	var.clear();//一定要clear(),否则无法打印出内容
	in.clear();
	in.seekg(0,ios::beg);//将文件指针指到文件头
	while (getline(in, line))
	{
		ss.clear();
		ss.str(line);
		while (ss >> a)
		{
			var.push_back(a);
		}
	}
	for (auto c : var)
	{
		cout << c << "\t";
	}
	in.close();
	system("pause");
}

(1)文件指针改变方法:

一般是使用seekg函数来控制文件的指针:
//打开后默认是指向文件开头
//因此打开后有没有下面这句代码是一样的,下面的代码表示指向文件开头
streamObject.seekg(ios::beg);//指向开头(和streamObject.seekg(0,ios::beg)效果是一样的)
streamObject.seekg(ios::end);//指向末尾:
streamObject.seekg(10,ios::cur);   //让文件指针从当前位置向文件末方向移动10个字节 
streamObject.seekg(-10,ios::cur);   //让文件指针从当前位置向文件开始方向移动10个字节 
streamObject.seekg(10,ios::beg);    //让文件指针定位到离文件开头10个字节的位置

(2)vector排序时,默认由小到达,less可以直接使用,而想要由大到小排序,需要添加头文件

#include <functional>
sort(var.begin(), var.end(), greater<int>());//greater需要添加头文件#include <functional>,less不需要

(3)stringstream

这里使用:

stringstream ss;
	while (getline(in,line))
	{
		ss.clear();
		ss.str(line);
		while(ss>>a)
		{ 
		   var.push_back(a);
		}
	}

而不是:

while (getline(in, line))
	{
		stringstream ss(line);
		while (ss >> a)
		{
			var.push_back(a);
		}
	}

在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。如果打算在多次转换中使用同一个stringstream对象,记住每次转换前要使用clear()方法;

(4)vs调试期间经常出现错误:

internal error during IMAGE::BuildImage


不是程序问题,只需要在工程上,右键->清除。然后重新编译即可。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值