更多参考其他文档菜鸟文档W3C微软C++文档

参考资料:

  1. C++中string转int
  2. C++ getline函数用法详解
  3. C++文件读写详解(ofstream,ifstream,fstream)
  4. C++系列:标准模板库STL(1)(七)
//目的:以文本形式将数据按行读入到定义好的数据对象中 

#include<iostream>
#include<string>
#include <sstream> //要使用stringstream流应包含此头文件
#include<fstream>
using namespace std;

//以图书的数据为例
typedef struct book{
string ISBN;
string name;
int yuan;
}book;

int main()
{
stringstream stream; //定义stringstream这个对象
string x;
book newbook[5];

ifstream srcFile("book.txt", ios::in); //以文本模式打开in.txt备读
if (!srcFile) { //打开失败
cout << "error opening source file." << endl;
return 0;
}

int i= 0;
string mid;
while (getline(srcFile,x)) {
newbook[i].ISBN.assign(x,0,17); //按位复制 从第1个字符开始复制17个字符,注意中文占两个字符。
newbook[i].name.assign(x,18,12);
mid.assign(x,31,3);
stream << mid; //数据输入string转换为int
stream >> newbook[i].yuan ; //将转换为int的数据输出
stream.clear(); //重复使用需要先清空
cout << " ok " << endl;
i++;
}

for(int i= 0;i<5 ;i++)
{
cout << newbook[i].ISBN<< " " << newbook[i].name<< " " << newbook[i].yuan<< " ok " << endl;
}

srcFile.close(); //关闭文件
return 0;
}

然而可以不用这麻烦,这种定位复制的方法会将空格也复制,所以如果是对齐的数据的话,因为数据长度不相同导致复制了很多长度不相同的空格,还要想办法去除,实际上是很麻烦的。

好了,本来应该很简单就搞定的,这样:



int main()
{
book newbook[5];

ifstream srcFile("book.txt", ios::in); //以文本模式打开in.txt备读
if (!srcFile) { //打开失败
cout << "error opening source file." << endl;
return 0;
}

int i= 0;
while(!srcFile.eof()) //判断文件是否读到最后
{
srcFile>>L.elem[i].isbn>>L.elem[i].bookname>>L.elem[i].price; //按类型读,遇空格结束一个数据,而且类型是匹配的
L.length++;
i++;
}

for(int i= 0;i<5 ;i++)
{
cout << newbook[i].ISBN<< " " << newbook[i].name<< " " << newbook[i].yuan<< " ok " << endl;
}

srcFile.close(); //关闭文件
return 0;
}

如果有任何疑问欢迎留言。