★这样为什么不能建立文件??????
★这样为什么不能建立文件
环境:C语言 Turbo C++3.0
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
void main()
{
char *fname,*lujing = "f:\\";
FILE *fp;
clrscr();
scanf("%s",fname); //输入磁盘文件名
strcat(lujing,fname);
//建立文件
if ((fp = fopen(lujing,"w")) == NULL)
{printf("file open error");
exit(0);
}
fclose(fp);
}
//我输入0000然后回车,但是却不能建立文件。原想应该在f:下建立0000文件的。哪错了?
问题点数:28、回复次数:12Top
1 楼jarjarbinks(一个曾经彷徨的程序员)回复于 2003-08-01 12:55:05 得分 5
把你的lujing变量打出来看看,可能其中有乱码。
char *fname 应该修改为char fname[x]。
scanf没有core调算你幸运。
Top
2 楼Leomaxking(害怕孤独,但已习惯孤独)回复于 2003-08-01 12:55:07 得分 5
指针fname悬空
考虑dos下文件名不能超过14个字符 建议char fname[20]Top
3 楼Leomaxking(害怕孤独,但已习惯孤独)回复于 2003-08-01 13:01:49 得分 3
另:char *lujing = "f:\\";改为char lujing[25]="f:\\"为好Top
4 楼jincai(Andy)回复于 2003-08-01 13:18:26 得分 0
strcat(lujing,fname);
怎会是字符串连接呢?
改为strcpy()看看!Top
5 楼zoezinsser(wealth)回复于 2003-08-01 13:29:09 得分 0
既然主函数返回值为void,那还为什么用exit(0);Top
6 楼onlydelphiandi(领会精神)回复于 2003-08-01 15:14:11 得分 0
upTop
7 楼Leomaxking(害怕孤独,但已习惯孤独)回复于 2003-08-01 16:24:21 得分 0
strcat和exit(0)的用法都是正确的Top
8 楼iting(倚天)回复于 2003-08-01 16:54:46 得分 5
好象fopen当文件不存在时的自动建立功能并不是在所有Win操作系统和文件系统下都适用。
fname的用法的确错了,但是通常不至于不建立文件,因为已经给他写了几个字符,应该可以建出来一个文件来(虽然破坏了未知内存空间)。
建议最好明确的使用CreateFile建立。Top
9 楼onlydelphiandi(领会精神)回复于 2003-08-04 18:48:48 得分 0
为什么用char *lujing = "f:\\";就不行?它和char lujing[] = "f:\\";有什么区别?Top
10 楼antijpn(antijpn)回复于 2003-08-04 19:50:00 得分 5
问题在strcat、fname和lujing上面
fname应该是随机指向一个地址,而lujing指向了静态存贮区中的地址
静态存贮区的东西容不得你随便改,所以你用strcat把fname连接到lujing后面会有问题
你可以把lujing变成一个字符数组,也就是用[]声明,这样的话,f:\就在栈内,使用lujing的时候会指向栈内的地址,只要不是数组越界,基本上没有问题
但是如果你想使用strcat把东西连接起来,就不能用char lujing[]="f:\\"了,这样内存分配的时候lujing只有4个byte的空间,你再用strcat就越界了,上面有几位说到用char lujing[20]是可取的Top
11 楼onlydelphiandi(领会精神)回复于 2003-08-05 11:51:50 得分 0
to;楼上的
可是我只是将char *fname,*lujing = "f:\\";改为char *fname,lujing[] = "f:\\";
便能建立文件了,没有错误,如何解释????????
不信你们试试。Top
12 楼antijpn(antijpn)回复于 2003-08-05 12:51:33 得分 5
能建立文件是因为lujing在定义的时候被定义成为一个字符数组,虽然越界,但是fopen函数读取文件名是一直读到'\0'为止,所以虽然可以创建文件,实际上已经造成了越界
如果不相信的话,可以在lujing前面定义一个int类型的变量,你在scanf之前看一下这个变量是多少,在scanf之后你再看看这个int是不是一样
说实话,你这样做是极度危险的,搞不好程序就崩溃了Top



