C++打开文件函数
charopen(charfilename[30]){FILE*fp;charch;gets(filename);if((fp=fopen(filename,"r+"))...
char open(char filename[30])
{
FILE *fp;
char ch;
gets(filename);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("Cannot open this file\n");
return ;
}
ch=fgetc(fp);
while(! feof(fp))
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
putchar(10);
return(ch);
}
这个函数有什么需要修改的地方么?调用的时候要怎么调用? 展开
{
FILE *fp;
char ch;
gets(filename);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("Cannot open this file\n");
return ;
}
ch=fgetc(fp);
while(! feof(fp))
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
putchar(10);
return(ch);
}
这个函数有什么需要修改的地方么?调用的时候要怎么调用? 展开
展开全部
C++通过以下几个类支持文件的输入输出
(1) ofstream:写操作,输出文件类;
(2) ifstream:读操作,输入文件类;
(3) fstream:可同时读写的文件类。
1. open函数:打开文件
函数原型:void open(const char*filename,int mode,int access);
参数说明:filename: 要打开的文件名
mode: 要打开文件的方式
access: 打开文件的属性
打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:
ios::app: 以追加的方式打开文件
ios::ate: 文件打开后定位到文件尾,ios:app就包含有此属性
ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
ios::in: 文件以输入方式打开
ios::out: 文件以输出方式打开
ios::nocreate: 不建立文件,所以文件不存在时打开失败
ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
ios::trunc: 如果文件存在,把文件长度设为0
可以用“或”把以上属性连接起来,如ios::out|ios::binary
打开文件的属性取值是:
0:普通文件,打开访问
1:只读文件
2:隐含文件
4:系统文件
例如:以二进制输入方式打开文件c:\config.sys
fstreamfile1;
file1.open("c:\\config.sys",ios::binary|ios::in,0);
ofstream file;
file.open ("example.bin", ios::out |ios::app | ios::binary);
2. close函数
函数原型:void close()
3. 二进制文件(Binary files)
在二进制文件中,使用<< 和>>,以及函数(如getline)来操作符输入和输出数据,没有什么实际意义,虽然它们是符合语法的。
文件流包括两个为顺序读写数据特殊设计的成员函数:write 和 read。第一个函数 (write) 是ostream 的一个成员函数,都是被ofstream所继承。而read 是istream 的一个成员函数,被ifstream 所继承。类 fstream 的对象同时拥有这两个函数。它们的原型是:
write ( char *buffer, streamsize size );
read ( char * buffer, streamsize size );
这里 buffer 是一块内存的地址,用来存储或读出数据。参数size 是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。
(1) ofstream:写操作,输出文件类;
(2) ifstream:读操作,输入文件类;
(3) fstream:可同时读写的文件类。
1. open函数:打开文件
函数原型:void open(const char*filename,int mode,int access);
参数说明:filename: 要打开的文件名
mode: 要打开文件的方式
access: 打开文件的属性
打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:
ios::app: 以追加的方式打开文件
ios::ate: 文件打开后定位到文件尾,ios:app就包含有此属性
ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
ios::in: 文件以输入方式打开
ios::out: 文件以输出方式打开
ios::nocreate: 不建立文件,所以文件不存在时打开失败
ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
ios::trunc: 如果文件存在,把文件长度设为0
可以用“或”把以上属性连接起来,如ios::out|ios::binary
打开文件的属性取值是:
0:普通文件,打开访问
1:只读文件
2:隐含文件
4:系统文件
例如:以二进制输入方式打开文件c:\config.sys
fstreamfile1;
file1.open("c:\\config.sys",ios::binary|ios::in,0);
ofstream file;
file.open ("example.bin", ios::out |ios::app | ios::binary);
2. close函数
函数原型:void close()
3. 二进制文件(Binary files)
在二进制文件中,使用<< 和>>,以及函数(如getline)来操作符输入和输出数据,没有什么实际意义,虽然它们是符合语法的。
文件流包括两个为顺序读写数据特殊设计的成员函数:write 和 read。第一个函数 (write) 是ostream 的一个成员函数,都是被ofstream所继承。而read 是istream 的一个成员函数,被ifstream 所继承。类 fstream 的对象同时拥有这两个函数。它们的原型是:
write ( char *buffer, streamsize size );
read ( char * buffer, streamsize size );
这里 buffer 是一块内存的地址,用来存储或读出数据。参数size 是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。
展开全部
首先,你这个是个C语言函数,不算是C++吧。
然后,你函数本身没什么问题,但是在指定文件名时有问题,现在有三种改法:
1.文件名是调用该函数时由调用者传入的,这种情况下,去掉gets(filename);这一行,因为这个函数的意思是由用户手动输入想要打开的文件名,现在既然是直接传入,就不需要这个获取用户输入的函数了,调用方法如下:
#include<stdio.h>
#include<stdlib.h>
char open(char filename[30])
{
FILE *fp;
char ch;
if((fp=fopen(filename,"r+"))==NULL)
{
printf("Cannot open this file\n");
return 0;
}
ch=fgetc(fp);
while(!feof(fp))
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
putchar(10);
return ch;
}
int main()
{
open("d:\\a.txt");
return 0;
}
2.文件名是用户手动输入的,这种情况下改成下面这个样子
#include<stdio.h>
#include<stdlib.h>
char open()
{
FILE *fp;
char ch,filename[30];
gets(filename);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("Cannot open this file\n");
return 0;
}
ch=fgetc(fp);
while(!feof(fp))
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
putchar(10);
return ch;
}
int main()
{
open();
return 0;
}
因为是用户手动输的,别的函数调用open时就不用指定参数,open也不需要参数,只是跑起来后由用户输文件名就行了
3.推荐改法:如果调用者指定了文件名,就按该文件名打开,要是没有指定(即filename为空),就要求用户输入
#include<stdio.h>
#include<stdlib.h>
char open(char filename[30])
{
FILE *fp;
char ch;
if(!filename[0]) //filename里面没有内容,这样得让用户输
gets(filename);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("Cannot open this file\n");
return 0;
}
ch=fgetc(fp);
while(!feof(fp))
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
putchar(10);
return ch;
}
int main()
{
open("d:\\a.txt"); //既可以这样调用,此时用户不必输入
open("");//又可以这样,此时由用户输入文件名
return 0;
}
这是比较人性化的改法
有问题请追问啊
然后,你函数本身没什么问题,但是在指定文件名时有问题,现在有三种改法:
1.文件名是调用该函数时由调用者传入的,这种情况下,去掉gets(filename);这一行,因为这个函数的意思是由用户手动输入想要打开的文件名,现在既然是直接传入,就不需要这个获取用户输入的函数了,调用方法如下:
#include<stdio.h>
#include<stdlib.h>
char open(char filename[30])
{
FILE *fp;
char ch;
if((fp=fopen(filename,"r+"))==NULL)
{
printf("Cannot open this file\n");
return 0;
}
ch=fgetc(fp);
while(!feof(fp))
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
putchar(10);
return ch;
}
int main()
{
open("d:\\a.txt");
return 0;
}
2.文件名是用户手动输入的,这种情况下改成下面这个样子
#include<stdio.h>
#include<stdlib.h>
char open()
{
FILE *fp;
char ch,filename[30];
gets(filename);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("Cannot open this file\n");
return 0;
}
ch=fgetc(fp);
while(!feof(fp))
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
putchar(10);
return ch;
}
int main()
{
open();
return 0;
}
因为是用户手动输的,别的函数调用open时就不用指定参数,open也不需要参数,只是跑起来后由用户输文件名就行了
3.推荐改法:如果调用者指定了文件名,就按该文件名打开,要是没有指定(即filename为空),就要求用户输入
#include<stdio.h>
#include<stdlib.h>
char open(char filename[30])
{
FILE *fp;
char ch;
if(!filename[0]) //filename里面没有内容,这样得让用户输
gets(filename);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("Cannot open this file\n");
return 0;
}
ch=fgetc(fp);
while(!feof(fp))
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
putchar(10);
return ch;
}
int main()
{
open("d:\\a.txt"); //既可以这样调用,此时用户不必输入
open("");//又可以这样,此时由用户输入文件名
return 0;
}
这是比较人性化的改法
有问题请追问啊
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询