关于利用fopen函数创建文件的问题

void oppfile(void)
{
char *s;
FILE *fp;
printf("Enter output file name: ");
scanf("%s",s);
if((fp = fopen(s,"wb+")) == NULL){
printf("can't open file : %s",s);
exit(EXIT_FAILURE);
}
num_parts = fwrite(inventory, sizeof (struct part),num_parts,fp);
fclose(fp);
想要利用这个函数创建一个特定名称的文件,但是运行的时候,系统提示说 s 未经初始化,
1 请问该如何输入文件的路径和名称才能够创建文件?
2 请问我在fopen函数的第一个参数直接输入文件名时,VS2010会自动创建一个文件,但是我加上路径时就无法创建了,为什么啊?我试过把 ' \ ' 换成 ' / ' 或' \\ ' 都不行?

函数原型:FILE * fopen(const char * path,const char * mode);

相关函数:open,fclose,fopen_s,_wfopen

返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中。

参数说明:

参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

mode有下列几种形态字符串:

r 以只读方式打开文件,该文件必须存在。

r+ 以可读写方式打开文件,该文件必须存在。

rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。

w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)

a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)

wb 只写打开或新建一个二进制文件;只允许写数据。

wb+ 读写打开或建立一个二进制文件,允许读和写。

ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。

wx 创建文本文件,只允许写入数据.[C11]

wbx 创建一个二进制文件,只允许写入数据.[C11]

w+x 创建一个文本文件,允许读写.[C11]

wb+x 创建一个二进制文件,允许读写.[C11]

w+bx 和"wb+x"相同[C11]

例子:

#include<stdio.h>
 
#define F_PATH "d:\\myfile\\file.dat"
int main(void)
{
    FILE*fp=NULL;//需要注意
    fp=fopen(F_PATH,"r");
    if(NULL==fp)
    {
        return -1;//要返回错误代码
    }
    fclose(fp);
    fp=NULL;//需要指向空,否则会指向原打开文件地址
    
     return 0;
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-07-22
char *s ,未分配内存而是用,是对野指针操作,scanf写入的是不可靠地址,内存泄漏,
第2个回答  2012-07-22
char *s; 把这个改为char s[128]; 就行了
路径不行的问题,请把你使用的路径贴出来看看追问

如果声明为 char s[128]; 然后再后面用的时候,fopen(s, "w");从fopen函数的原型上来看,第一个参数应该是指向字符串的指针,可s是指向字符数组的指针,虽然我试试可以,但是可以解释下为什么吗?

路径问题我已经解决了。在盘符下面忘了带分隔符了,我从命令行输入文件路径的时候盘符下面不能带分隔符,不然就出错,没想到这里又要带。

追答

字符数组虽然不等价于指针,你可以把字符数组看成是常量的指针,就是说除了不能被修改,其他的地方和指针是一样的,本质都是指向某一内存空间的地址。

追问

在编译上与差别吗?比如说如果是字符串指针的话,因为确定了类型,所以fopen函数会一直读取知道遇见一个空白字符为止,可是如果传递的如果是字符数组指针的话,那就是简简单单的指向数组的第一个元素的指针,两者指向的对象完全不一样啊,编译器如何区分呢?

追答

编译上是一模一样的, 不管是字符数组还是字符指针,都是一直读取到'\0',编译器不会检查数组的长度

本回答被提问者采纳
第3个回答  2012-07-22
char s[100];
第4个回答  2018-11-06
char *s;//s是一个字符串常量,是不允许修改的
改成字符数组应该就可以了

关于利用fopen函数创建文件的问题
void oppfile(void) { char *s; FILE *fp; printf("Enter output file name: "); scanf("%s",s); if((fp = fopen(s,"wb+")) == NULL){ printf("can't open file : %s",s); exit(EXIT_FAILURE); } num_parts = fwrite(inventory, sizeof (struct p... 展开 langzihankang | 浏览5303...

【急】c语言 fopen为毛建不了文件啊。。。
回答:fp=fopen("c:\\c语言\\Box.scr","r");你这是只读方式打开,不会自动建立文件的。 fp=fopen("c:\\c语言\\Box.scr","w");\/\/以写方式打开。没有文件,自动创建。

C语言题目要求用fopen函数写新建并打开character.txt 文件的程序,求问...
if ( fp=fopen("c:\\\\data\\\\data.txt","w+") ) { \/\/建立并写打开文件 sprintf(buffer,"%.3f\\n",pi); fputs(buffer,fp); fclose(fp);if ( fp=fopen("c:\\\\data\\\\data.txt","r") ) { \/\/读打开文件 fgets(buffer,255,fp); printf("%s\\n",buffer); fclose(fp);} else pri...

c语言中的fopen能创建文件夹吗?
这是不能够的。要想创建文件夹,可以先包含头文件stdlib.h,(在C++中可以包含cstdlib)然后使用system("md d:\\\\mydir");就可以了:#include#includeusing namespace std;int main(){ system("md d:\\\\mydir");system("dir d:\\\\mydir*.*"); return 0;}运行截图如下:...

c语言fopen函数问题
fopen函数返回的是一个FILE类型的指针,如果是打开文件,文件不存在的话返回值为空,如果存在就返回指向该文件的指针,如果是新建一个文件,返回值就是新建文件的指针,可以利用该指针实现对文件的读写功能。至于判断是读还是写,是跟fopen第二个参数决定的,也就是由你自己决定。代码举例:FILE *fp;fp...

C语言求大神。为什么我的fopen创建不了文件啊。就是我运行也可以。就...
宏变量名 加了引号就不是宏了,而是字符串!改为:char mydata[80]="C:\\\\huliangkai\\\\Downloads\\\\student.txt";f = fopen(mydata,"w+");。。。(mydata,"r");

C语言求大神。为什么我的fopen创建不了文件啊
这里写错了:f = fopen("ADDRESS_DATA", "w+");因为你用的是宏,去掉引号就可以了 f = fopen(ADDRESS_DATA, "w+");

用fopen()函数中的wb+重新创建文件后怎么判断文件内容为空
1.根据getc返回值判断,但是要注意getc返回 非EOF 后要用fseek重新定位文件读写位置,再进行相应的读写操作 2.可用fseek()将读指针移到文件末端,然后ftell()一下,根据文件长度确定文件是否为空

C语言我知道可以用fopen函数生成新文件,那怎么在指定的路径下生成自定义...
创建F:\\C\\test.txt文件的语句格式如下:FILE *pFile = fopen("F:\\\\C\\\\test.txt","rt"); \/\/ 差别仅是将 \\ 双写为 \\\\ ,原因是在C\/C++中,\\ 被用于转义字符的起始字符。

fopen函数用法
其他组合模式,如"w+"、"a+"等,分别表示不同的读写和创建\/追加行为。3. 返回值处理:如果文件成功打开,fopen函数返回一个FILE指针,该指针可用于后续的文件读写操作。如果打开失败,则返回NULL。因此,在使用fopen打开文件后,通常需要检查返回值是否为NULL,以确定文件是否成功打开。4. 使用示例:以...

相似回答