标题:关于C++文件操作里的指针问题
只看楼主
大地飞歌
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-4-16
 问题点数:0 回复次数:5 
关于C++文件操作里的指针问题

修改后的程序如下:

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>

class student
{
private:

int sum;
int grade;
static int aver;
static int number;
static long place;
public:
student()
{
number++;
}
void insete_txt(int study,char *name,int grade)
{

fstream f("stu.txt",ios::out|ios::app);
f<<study<<endl;
f<<name<<endl;
f<<grade<<endl;
f.close();

}
void output_c(int sum)
{
char name[10];
int study,grade,i;

cout<<"∷∷∷∷∷∷∷∷∷∷★☆☆☆★【学生信息统计】★☆☆☆★∷∷∷∷∷∷∷∷∷∷∷"<<endl;
fstream f;
f.open("stu.txt",ios::in);
f.seekg(place,ios::beg);

//用seekg函数定位指针读取时的位置;其中place已经获得本次追加文件的开头;
for(i=0;i<sum;i++)
{
cout<<"---------第"<<i+1<<"位学生的信息:--------"<<endl;
f>>study;
f>>name;
f>>grade;
cout<<"学号:"<<study<<endl;
cout<<"姓名:"<<name<<endl;
cout<<"成绩:"<<grade<<endl;
}
f.close();

}
void average(int grade)
{
aver=aver+grade;

}
void summa()
{
aver=aver/number;
cout<<"------------------------------------------------------------------------------"<<endl;
cout<<"\n【本班学生平均分为:"<<aver<<"】"<<endl;
cout<<"\n\n\n\n\n∷∷∷∷∷∷∷∷∷∷∷『作者:韩震 日期:2006年4月15日』∷∷∷∷∷∷∷∷∷∷∷∷"<<endl;
getchar();
}
void play()
{
fstream f("stu.txt",ios::out|ios::app); //以追加的形式打开文件;为了得到当前文件指针位置
place=f.tellp(); //把当前位置赋给静态变量place;
f.close();
}

};
class display
{
public:

void show()
{
cout<<"∷∷∷∷∷∷∷∷∷∷★☆☆☆★【学生信息系统】★☆☆☆★∷∷∷∷∷∷∷∷∷∷∷"<<endl;
cout<<"\n\n";
cout<<"『OK!学生信息录入完成!』"<<endl;
cout<<"\n\n\n\n\n\n\n";
cout<<"「功能选项:」\t"<<"〖[Y]→显示学生信息〗\t"<<"〖[N]→退出程序〗"<<"\n\n\n\n\n";
}
void show2()
{
cout<<"∷∷∷∷∷∷∷∷★☆☆☆★【欢迎登陆学生信息系统】★☆☆☆★∷∷∷∷∷∷∷∷∷"<<endl;
cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;
cout<<"『要清除数据库中原有数据请按: y ;否则的话按任意字符+Enter继续.......』";
}
void show3()
{
cout<<"∷∷∷∷∷∷∷∷∷∷★☆☆☆★【学生信息录入】★☆☆☆★∷∷∷∷∷∷∷∷∷∷∷"<<endl;
}

};
int student::number;
int student::aver=0;
long student::place=0;
void main()
{
int study,grade,sum,i;
char name[10],select,select1;
display dis;

dis.show2();
cin>>select1;
if(select1=='y'||select1=='Y')
{
fstream f("stu.txt",ios::trunc);
f.close();
system("cls");
}
else
{
system("cls");
}

dis.show3();
cout<<endl<<endl<<endl<<endl<<endl;

cout<<"\t〖请输入学生个数〗:";
cin>>sum;

system("cls");

student *stu;
stu=new student[sum];
(*stu).play(); //写入之前调用函数,获得当前指针的位置;

for(i=0;i<sum;i++)
{
dis.show3( );
cout<<"\t〖第"<<i+1<<"位学生信息〗"<<endl;
cout<<"输入学号:";
cin>>study;
cout<<"输入姓名:";
cin>>name;
cout<<"输入成绩:";
cin>>grade;
(*(stu+i)).insete_txt(study,name,grade);
(*(stu+i)).average(grade);
system("cls");
}

dis.show();
cout<<"\tselect:";
cin>>select;

if(select=='y'||select=='Y')
{
system("cls");
(*stu).output_c(sum);
(*stu).summa();

}

delete [] stu;

}

程序中我已经使用了指针来控制文件读取的位置但是它还是每次都从第一行开始读取,

实在搞不明白。应为是初学C++还请 师兄们帮帮忙啊.谢谢你们了~~!

接受tellp()的值的变量已经改为long型;但是他怎么还是从文件开头开始读取呀指针没有起到作用呀;

[此贴子已经被作者于2006-4-18 17:16:59编辑过]

搜索更多相关主题的帖子: int 指针 include 文件 
2006-04-17 23:26
gototheworld
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2006-3-24
得分:0 
以下是引用大地飞歌在2006-4-17 23:26:00的发言:

很不错,只有两三处小错误

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>

class student
{
private:

int sum;
int grade;
static int aver;
static int number;
static long place;//这里最好用long因为tellp()返回值是long类型
public:
student()
{
number++;
}
void insete_txt(int study,char *name,int grade)
{

fstream f("stu.txt",ios::out|ios::app);
f<<study<<endl;
f<<name<<endl;
f<<grade<<endl;
f.close();

}
void output_c(int sum)
{
char name[10];
int study,grade,i;

cout<<"∷∷∷∷∷∷∷∷∷∷★☆☆☆★【学生信息统计】★☆☆☆★∷∷∷∷∷∷∷∷∷∷∷"<<endl;
fstream f;
f.open("stu.txt",ios::in);
f.seekg(place,ios::beg); //用seekg函数定位指针读取时的位置;其中place已经获得本次追加文件的开头;
for(i=0;i<sum;i++)
{
cout<<"---------第"<<i+1<<"位学生的信息:--------"<<endl;
f>>study;
f>>name;
f>>grade;
cout<<"学号:"<<study<<endl;
cout<<"姓名:"<<name<<endl;
cout<<"成绩:"<<grade<<endl;
}
f.close();

}
void average(int grade)
{
aver=aver+grade;

}
void summa()
{
aver=aver/number;
cout<<"------------------------------------------------------------------------------"<<endl;
cout<<"\n【本班学生平均分为:"<<aver<<"】"<<endl;
cout<<"\n\n\n\n\n∷∷∷∷∷∷∷∷∷∷∷『作者:韩震 日期:2006年4月15日』∷∷∷∷∷∷∷∷∷∷∷∷"<<endl;
getchar();
}
void play()
{
fstream f("stu.txt",ios::out|ios::app); //以追加的形式打开文件;为了得到当前文件指针位置
place=f.tellp(); //把当前位置赋给静态变量place;
f.close();
}

};
class display
{
public:

void show()
{
cout<<"∷∷∷∷∷∷∷∷∷∷★☆☆☆★【学生信息系统】★☆☆☆★∷∷∷∷∷∷∷∷∷∷∷"<<endl;
cout<<"\n\n";
cout<<"『OK!学生信息录入完成!』"<<endl;
cout<<"\n\n\n\n\n\n\n";
cout<<"「功能选项:」\t"<<"〖[Y]→显示学生信息〗\t"<<"〖[N]→退出程序〗"<<"\n\n\n\n\n";
}
void show2()
{
cout<<"∷∷∷∷∷∷∷∷★☆☆☆★【欢迎登陆学生信息系统】★☆☆☆★∷∷∷∷∷∷∷∷∷"<<endl;
cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;
cout<<"『要清除数据库中原有数据请按: y ;否则的话按任意字符+Enter继续.......』";
}
void show3()
{
cout<<"∷∷∷∷∷∷∷∷∷∷★☆☆☆★【学生信息录入】★☆☆☆★∷∷∷∷∷∷∷∷∷∷∷"<<endl;
}

};
int student::number;
int student::aver=0;
long student::place=0;
void main()
{
int study,grade,sum,i;
char name[10],select,select1;
display dis;

dis.show2();
cin>>select1;
if(select1=='y'||select1=='Y')
{
fstream f("stu.txt",ios::trunc);
f.close();
system("cls");
}
else
{
system("cls");
}

dis.show3();
cout<<endl<<endl<<endl<<endl<<endl;

cout<<"\t〖请输入学生个数〗:";
cin>>sum;

system("cls");

student *stu;
stu=new student[sum];
(*stu).play(); //写入之前调用函数,获得当前指针的位置;

for(i=0;i<sum;i++)
{
dis.show3();
cout<<"\t〖第"<<i+1<<"位学生信息〗"<<endl;
cout<<"输入学号:";
cin>>study;
cout<<"输入姓名:";
cin>>name;
cout<<"输入成绩:";
cin>>grade;
(*(stu+i)).insete_txt(study,name,grade);
(*(stu+i)).average(grade);
system("cls");
}

dis.show();
cout<<"\tselect:";
cin>>select;

if(select=='y'||select=='Y')
{
/* system("cls");*/这句话要去掉,你不能清除,否则就得不到你想要的结果
(*stu).output_c(sum);
(*stu).summa();

}

delete [] stu;

}


路漫漫其修远兮 吾将上下而求索
2006-04-18 11:26
大地飞歌
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-4-16
得分:0 
/* system("cls");*/这句话要去掉,你不能清除,否则就得不到你想要的结果
谢谢 不过这句话不影响程序结果吧。我试了好象没有影响。
我把tellp改成long型了但是读取文件的时候依旧是从开头进行读取。郁闷死啦~~~
2006-04-18 17:05
大地飞歌
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-4-16
得分:0 
我的意思就是说。
下次打开程序输入内容然后查看结果的时候显示的是当次的内容 ,而不在显示一开始输入的内容 。我把 tellp的值赋给了long型 但是结果依旧是从文件头开始读取。指针没有起到任何作用。我也是刚刚接触到指针 ,很多东西都不清楚 。谢谢楼上的师兄告诉我tellp的值为long型。

上面的问题还是没有解决还要麻烦大家一下。非常感谢!
2006-04-18 17:11
dianpozi
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2004-10-31
得分:0 
我说下我的一些看法
首先是几句
fstream f("stu.txt",ios::out|ios::app);
f'<<'study'<<'endl;
f'<<'name'<<'endl;
f'<<'grade'<<'endl;
f.close();
如这一句,f'<<'study'<<'endl;你先把study输入到文件中,然后输入endl,
但是这个endl应该是不确定的,没记错的话他相当一个回车,它似乎可以
任意改变的

再看这个函数
void play()
{
fstream f("stu.txt",ios::out|ios::app); //以追加的形式打开文件;为了得到当前文件指针位置
place=f.tellp(); //把当前位置赋给静态变量place;
f.close();
}
既然输入的endl不确定大小,那么也就是说,文件的尾巴也不确定,所以才
出现了lz的问题
这只是我的一些想法,也许不象lz那样存储数据的话,问题就解决了!
2006-04-18 19:41
大地飞歌
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-4-16
得分:0 

这个问题我已经解决了。
只加了一个语句就正确了;


void play()
{
fstream f("stu.txt",ios::out|ios::app);
f<<" "; //打开文件进行写入的时候写入一个空格,然后下一个语句才能接收到f.tellp的值;
place=f.tellp();
f.close();
}

谢谢楼上的2位兄弟帮我分析问题。非常感谢你们的热心!!!!

2006-04-18 21:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-58177-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027034 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved