中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
求助!编程时OPEN函数的问题!
作者:未知 时间:2005-09-13 19:28 出处:ChinaUnix.net 责编:chinaitpower
              摘要:求助!编程时OPEN函数的问题!

我在OPEN函数中直接使用文件名的串可以创建文件.
例: OPEN("FILENAME",O_CREAT,0700);
而我用READ函数接收输入的字符串到一个字符串数组,创建文件由该字符串数组指定的文件名.
例: READ(0,FILENAME,SIZEOF(FILENAME));
     OPEN(FILENAME,O_CREAT,0700);
运行时系统出现MEMORY FAULT - CORE DUMPED 的出错信息.为什么会这样呢?

 windflowers1976 回复于:2004-05-09 13:08:50
[quote:aabbd45315="luoweiqiao"]我在OPEN函数中直接使用文件名的串可以创建文件.
例: OPEN("FILENAME",O_CREAT,0700);
而我用READ函数接收输入的字符串到一个字符串数组,创建文件由该字符串数组指定的文件名.
例: READ(0,FILENAME,SIZEOF(FILENA..........[/quote:aabbd45315]
贴出你的代码.
memset ( filename, 0, sizeof(filename) );
read ( 0, filename, sizeof(filename)-1 );
去学习下,如何进行安全的编程.

 luoweiqiao 回复于:2004-05-09 15:39:56
在READ 函数开始时我调用了BZERO函数.
但是运行的问题还是这样.

 luoweiqiao 回复于:2004-05-09 16:30:41
代码:
int fd;
char filename[80];
bzero(filename,sizeof(filename));
write(1,"filename:",9);
read(0,buf,sizeof(buf));
if(open(filename,O_CREAT,0700)<0(
{
 printf("file cannot creat\n");
exit(1);
}
printf("file is creat\n");
exit(0);
}

 hzhrh 回复于:2004-05-09 16:34:29
read函数应该是Open后的句柄。

 flw 回复于:2004-05-09 17:42:55
read 完了是不是有必要把回车符去掉?

 luoweiqiao 回复于:2004-05-09 22:28:43
没错啊!我是接受键盘输入。
我测试了一下,把读得的字符串的实际长度+1赋予0还是没用。

 lenovo 回复于:2004-05-09 22:34:40
[quote:e8c95b3d33="luoweiqiao"]没错啊!我是接受键盘输入。
我测试了一下,把读得的字符串的实际长度+1赋予0还是没用。[/quote:e8c95b3d33]

你检查一下'\n'字符在哪个位置?
应该在哪里赋值为0。

 luoweiqiao 回复于:2004-05-09 22:41:16
要加的话应该是加到字符串实际长度加+1的位置吧!
'\n',占用数组空间吗?

 win_hate 回复于:2004-05-09 23:12:42
[quote:4b32e863bb="luoweiqiao"]ero(filename,sizeof(filename));
write(1,"filename:",9);
read(0,buf,sizeof(buf));
if(open(filename,O_CREAT,0700)<0(
{
 printf("file cannot creat\n");
exit(1);
}
printf("file is creat\n");
e..........[/quote:4b32e863bb]

文件名读到 buf里了,却用 filename 去打开.....

 hsgzr 回复于:2004-05-10 00:08:01
文件名你没有保存到filename里 当然打不开了

 luoweiqiao 回复于:2004-05-10 01:12:04
不好意思,发上来的源代码打错了,不是BUF,是FILENAME。
我在测试时是用FILENAME。

 fwizard 回复于:2004-05-10 08:43:23
先读后建是什么意思?
把完整代码粘一下,可以帮你测试一下

 luoweiqiao 回复于:2004-05-10 09:38:53
这个程式是根据用户需要创建文件名.
void main(void)
{
int fd; 
char filename[80]; 
bzero(filename,sizeof(filename)); 
write(1,"filename:",9); 
read(0,filename,sizeof(filename)); 
if(open(filename,O_CREAT,0700)<0( 

printf("file cannot creat\n"); 
exit(1); 

printf("file is creat\n"); 
exit(0); 
}

很奇怪的是系统虽然显示MEMORY FAULT - CORE DUMPED 的信息,但是文件还是创建了.

 luoweiqiao 回复于:2004-05-10 09:58:01
文件虽然创建但是不能对文件进行操作,用LS 文件名不能显示这个文件.
在这个目录下用LS 文件名的第一个字符* 就可以显示这个文件.
如果将READ函数读取的这个串从第STRLEN(FILENAME)-1  开始到SIZEOF(FILENAME)-1 的字符赋予空格, 便不会出现MEMORY FAULT - CORE DUMPED . 这个提示,并且文件也创建了,和先前的一样文件还是不可以用 LS 文件名来显示这个文件名.

 fwizard 回复于:2004-05-10 10:03:57
[quote:b290fe8ba7]
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void) 

int fd; 
char filename[80]; 
bzero(filename,sizeof(filename)); 
write(1,"filename:",9); 
read(0,filename,sizeof(filename)); 
if(open(filename,O_CREAT,0700)<0)

printf("file cannot creat\n"); 
exit(1); 

printf("file is creat\n"); 
exit(0); 
} [/quote:b290fe8ba7]

测试没有问题啊
你在看看
另:[b:b290fe8ba7]if(open(filename,O_CREAT,0700)<0([/b:b290fe8ba7]错了

 luoweiqiao 回复于:2004-05-10 16:40:07
那为什么我运行的时候会出现MEMORY FAULT - CORE DUMPED  的提示信息呢?

 flw 回复于:2004-05-10 16:46:18
[quote:1279b8f674="luoweiqiao"]要加的话应该是加到字符串实际长度加+1的位置吧!
'\n',占用数组空间吗?[/quote:1279b8f674]
要加的话,应该是
filename[strlen(filename)-1] = 0x00;
才对。

你试试,问题应该出在这里了。

 flw 回复于:2004-05-10 16:56:30
[code:1:b697130ee4][mochou@WebAgent mochou]$ cat t1.c
# include <stdio.h>
# include <string.h>

int main( void )
{
    int fd;
    char filename[80];

    memset( filename, 0x00, sizeof(filename) );
    write(1,"filename:",9);
    read(0,filename,sizeof(filename));

    fprintf( stderr, "filename's len: [%d]\n", strlen(filename) );
    fprintf( stderr, "last char: [%d]\n", filename[strlen(filename)-1] );

    return 1;
}
[mochou@WebAgent mochou]$ cc -o t1 t1.c
[mochou@WebAgent mochou]$ ./t1
filename:abc
filename's len: [4]
last char: [10]
[mochou@WebAgent mochou]$[/code:1:b697130ee4]
楼主你看看,我只输入了 abc 三个字母,但是 strlen 的结果是 4,
说明多了一个字符,
多出来的最后一个字符是 ASCII 码的 10,也就是换行符。

所以,我想应该是这个原因引起的。

 fwizard 回复于:2004-05-10 17:16:29
[quote:39b3897d92]MEMORY FAULT - CORE DUMPED[/quote:39b3897d92]
flw大哥运行程序,会看到这个错误吗?奇了怪了

 luoweiqiao 回复于:2004-05-11 08:48:57
非常感谢各位!

 蓝色键盘 回复于:2004-05-11 09:31:21
read后
filename[strlen(filename)-1] = 0x0;

这样属于安全的方式,flw的正确的。

 lysheng29 回复于:2004-05-11 10:14:14
創建文件的filename 應是一個空終止的字串

 FH 回复于:2004-05-11 10:52:39
呵呵

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有