文件操作的程序,帮我看看

soulmachine 2007-09-05 10:34:07
这个程序想实现从标准输入输入一行,就写入文件一行,直到输入quit为止,可是为什么程序编译通过,运行也不打印错误,但是就是写不进文件呢?而且还有奇怪的回显,你输入一行,它回显一行,加个奇怪的小尾巴.
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>

#define NEWFILE (O_WRONLY|O_CREAT|O_TRUNC)
#define SIZE 10

int main(void)
{
int outfile;
char filename[] = "test.dat";
char buffer[SIZE];

if(outfile=open(filename, NEWFILE, 0640)==-1)
{
printf("Error, Open file failed!\n");
exit(255);
}
gets(buffer);
while(strcmp(buffer,"quit"))
{
if(write(outfile, buffer, sizeof(buffer))==-1)
{
printf("ERROR,WRITE FAILED: \n",sys_errlist[errno]);
exit(255);
}
gets(buffer);
}
close(outfile);
return 0;
}
...全文
95 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dai_weitao 2007-09-06
  • 打赏
  • 举报
回复
格式不统一的问题.
写入buffer里的加了\n, 就要在比较的时候也加上\n;
或者在写入的时候就不写\n.
jumper84 2007-09-06
  • 打赏
  • 举报
回复
write(outfile, buffer, SIZE);
roadingyh 2007-09-05
  • 打赏
  • 举报
回复
gets函数不是Linux推荐的函数,
最好用fgets(stddin,buf,len)
cceczjxy 2007-09-05
  • 打赏
  • 举报
回复
if(outfile=open(filename, NEWFILE, 0640)==-1)
的问题,==的优先级比=高,
改成
if((outfile=open(filename, NEWFILE, 0640))==-1)
就可以了
jufeng2309 2007-09-05
  • 打赏
  • 举报
回复
<加个奇怪的小尾巴>这个问题就是不断gets后,没有赋字符串结束符\0所导致!
你用标准的C函数去操作文件试试
int main(void)
{
char filename[10] = "test.dat";
char buffer[SIZE];
FILE *fp;

if(fp=fopen(filename,'w')==NULL)
{
printf("Error, Open file failed!\n");
exit(255);
}
gets(buffer);
while(strcmp(buffer,"quit"))
{
if(fwrite(fp, buffer, sizeof(buffer))==-1)
{
printf("ERROR,WRITE FAILED: \n",sys_errlist[errno]);
exit(255);
}
buffer[0]='\0';
gets(buffer);

}
fclose(fp);
return 0;
}
waft_xu 2007-09-05
  • 打赏
  • 举报
回复
write(outfile, buffer, sizeof(buffer));这样当字符串长度小于9时写入文件就会出现那样的情况
要使用字符串的长度strlen(buffer).
write(outfile, buffer, strlen(buffer));
Coeus 2007-09-05
  • 打赏
  • 举报
回复
出售一个QQ: 123456xx
等级: 38
全套的密码保护。非会员和QQ行,终身免费。
联系qq: 283765999
cceczjxy 2007-09-05
  • 打赏
  • 举报
回复
改成这样
while(strcmp(buffer,"quit\n"))
也可先把buffer中的\n去掉.

因为fgets函数读取时,把回车符号\n也读进来了.
soulmachine 2007-09-05
  • 打赏
  • 举报
回复
根据各位的意见,修改成如下,但是好像进入了死循环,输入quit也不退出.小弟怎么也找不到原因.
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>

#define NEWFILE (O_WRONLY|O_CREAT|O_TRUNC)
#define BUFSIZE 80

int main(void)
{
int outfile, i;
char filename[] = "test.dat";
char buffer[BUFSIZE];
for(i = 0; i < BUFSIZE; i++)
{
buffer[i] = '\0';
}

if((outfile=open(filename, NEWFILE, 0640))==-1)
{
printf("Error, Open file failed!\n");
exit(255);
}

fgets(buffer, BUFSIZE, stdin);
while(strcmp(buffer,"quit"))
{
if(write(outfile, buffer, sizeof(buffer))==-1)
{
printf("ERROR,WRITE FAILED: \n",sys_errlist[errno]);
exit(255);
}
/*clear the buffer*/
for(i = 0; i < BUFSIZE; i++)
{
buffer[i] = '\0';
}
fgets(buffer, BUFSIZE, stdin);
}
close(outfile);
return 0;
}
dai_weitao 2007-09-05
  • 打赏
  • 举报
回复
gets函数应该是不会为后面添加\0的.
所以, write的时候似乎会写buffer中的所有内容, 因为sizeof始终是10.

楼主应该改为fopen fwrite fgets.

gets也确实是不被linux推荐的, 因为容易造成缓冲区溢出的问题.
经常使用电脑可能也遇到过了! 突然‘咚’的一声 提示 内存不能为read 这个问题我以前也遇到过不知道怎么解决 现在终于有办法了!呵呵! 我们就看看是什么原因引起的吧,另外附送一个小工具修复见下面附件 总结下大概以下9个原因 1、驱动不稳定,与系统不兼容,这最容易出现内存不能为 Read 或者文件保护(主要原因) 2、系统安装了一个或者多个流氓软件,这出现 IE 或者系统崩溃的机会也比较大,也有可能出现文件保护 3、系统加载的程序或者系统正在运行的程序之前有冲突,尤其是部分杀毒软件监控程序 4、系统本身存在漏洞,导致容易受到网络攻击。 5、病毒问题也是主要导致内存不能为 Read、文件保护、Explorer.exe 错误…… 6、如果在玩游戏时候出现内存不能为 Read,则很大可能是显卡驱动不适合(这里的不适合有不适合该游戏、不适合电脑的显卡)也有可能是 系统版本不够新或者不符合该游戏、显卡驱动 7、部分软件本身自身不足的问题 8、电脑硬件过热,也是导致内存不能为 Read 的原因之一。 9、电脑内存与主板兼容性不好也是导致内存不能为 Read 的致命原因! 以上大概就是目前可以引起系统提示 内存不能为read的原因了 另外软件是针对只是针对部分原因引起的内存不为read所做修复,不是100%有效,大家可以试试看 说下原理: 就是批处理使用 regsvr32命令 将动态链接库文件重新注册 (system32下的所有 .dll 和 .ocx 文件;) 注意:由于修复工具会重新注册 system32下的所有 .dll 和 .ocx 文件操作对杀毒软件来说属于敏感操作,所以建议使用修复工具的时候,请禁用杀毒软件,以免部分杀毒误报!jie

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧