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