C++读写文件中的字符串
今天帮人做了个简单的作业,没想到花时间最多的不是算法而是文件的读写,还有对读入字符串的分割处理。晚上写作业的时候又用到了对字符串的处理,这里记录一下。
小白第一次写博客,做的不好的请多多指正。
题目如下:
Retail.dat文件中包含了某零售商店M的8万多条真实(16,470种)商品的销售记录(每行对应一条销售记录),现M店装修,需要把这些商品摆放在一个单行长柜中,如下:
… k K+1 K+2 …
其中每个格子仅放一种商品,且商店左右两侧各有一个门,顾客从左门进入挑选商品,并在把所有商品都加入购物篮后可以马上结帐从右门离去。注意顾客每次可能需要买多种商品,我们把顾客从进门选货到选完所有货物所经过的格子总数作为他的“购物不便程度”(以下简称“不便度”)度量,如:设顾客从左侧(格子编号从1开始)进入商店,他所需的货物分别摆放在101, 103, 210三个格子上,则该顾客的不便度为210。
请根据商品的历史销售记录,为装修后的M店设计一个合适的商品布局顺序,使得Retail.dat中所有顾客的总的不便度尽可能的小,并请编码实现和验证你的模型。程序的输入/输出要求描述如下:
输入:Retail.dat 文件
输出:Layout.dat 文件。该文件总共有16,470行,第2行至最后一行每行包含如下内容:
商品编号, 格子编号
如 “123,1”表示第123号商品应该摆放在第一个格子里面。
Layout.dat 文件的第一行是Retail.dat中所有购买记录在你的模型下的不便度的总和。
读入:从硬盘读入内存ifstream
首先将文件流对象与文件建立连接
- 注意这里判别是否打开失败很重要
我第一次做的时候文件根本没有读取到,但是我完全不知道。
把作业给朋友朋友也没有把文件放到同一位置,做一个简单的检验是有必要的。
string fileName = "retail.dat";
in.open(fileName.data(), ios::in); //将文件流对象与文件连接起来
assert(in.is_open()); //如果打开失败,这里会终止运行
-
要求读入文件中的全部数字,文件中数字的存储方式为:
因为文件的输入输出都是以字符串的形式,我面对的问题是:如何读取文件中的每一个字符串并将他们转换成数字。
这里可以提一下我踩过的坑(首先我没有试过二进制读取和定义指针的读取):1. 行末和行初会无法读入
string filename; string line; while (getline (in, line)) // line中不包括每行的换行符 { cout << line << endl; } }
2. 直接用EOF判定文件末尾的,问题都是最后一行无法读入或无法停止循环
ifstream FILE("test.txt"); while (FILE.peek() != EOF)//修改 { FILE.get(c); cout << c; }
3.试图直接逐个读取,但实际上行末或者行初会无法读入
string buffer; fstream in; in.open("com.txt",ios::in); while(!in.eof()) { in.getline(buffer,256,'\n');// 表示该行字符达到256个或遇到换行就结束 }
4.还有各种一边读入一边转换的骚操作,下次要一边尝试一边记录错误的经历
…
总而言之,最简单的做法应该是,逐行读取,在再提取空格,将单个字符串转换为数字。
注意这里用到了stringstream来再次读取从getline中读到的每一行,自动跳过空格。
stringstream ss(buffer);
这部分实现的代码如下:
string fileName = "retail.dat";
ifstream in;
in.open