IO例子

例子:单机模式下的文件上传和下载,单机是指在一台电脑上操作,服务器有一个共享目录,客户端能将文件上传到服务器的共享目录,也能从服务器的共享目录中下载文件到自己的客户端。

1、输入服务器的地址:路径和目录名

2、列出服务器中有哪些文件:
涉及目录io的内容:opendir reddir

3、输入从服务器下载的文件名 或 上传文件到服务器的文件名

4、文件下载

文件IO:open read write colse

标准IO: fopen fputs fgets fputc fgetc fread fwrite fcolse

#include"stdio.h"
#include"sys/types.h"
#include"dirent.h"
#include"string.h"
#include"unistd.h"
#include"fcntl.h"
int main()
{
 DIR *dp;
 int src_fd,des_fd;//定义文件IO的两个描述符,原文件和目的文件
 int fd;
 int ret;//读的返回值
 struct dirent *dir;
 char server[128]={0};//定义路径和名字的字符串
 char file[128]={0};//定义从键盘输入的文件名的字符串
 char buf[128]={0};//定义读取原文件读到这里的缓存
start:
 printf("请输入服务器的路径和共享目录的名字:\n");
 scanf("%s",server);//扫描从键盘输入的路径和名称
 
 //打开目录
 dp=opendir(server);
 if(dp==NULL)
 {
  printf("打开失败\n",server);
  goto start;//重新输入
 }
 printf("打开成功\n");
 
 //读取目录内容,列出有哪些文件
 
 while(1)
 {
  dir=readdir(dp);
  if(dir==NULL)//表示已经读取到了,跳出循环
   break;
  else
  {
   printf("inode=%ld\t file_name=%s\n",dir->d_ino,dir->d_name);
  }
 }
 printf("\n请输入下载的文件名:\n");
 scanf("%s",file);
 
 //上传文件,类似于cp复制的文件io操作
 //先打开原文件
 src_fd=open(strcat(strcat(server,"/"),file),O_RDONLY);//2个参数,文件路径+名称(server/file是绝对路径),所以用字符串连接函数strcat,打开方式
 if(src_fd <0)
 {
  printf("打开文件失败:%s\n",file);
  return -1;
 }
 printf("打开成功\n");
 //打开目标文件,复制过去时要创建一个文件
 des_fd=open(file,O_CREAT | O_WRONLY,0777);
 if(des_fd <0)
 {
  printf("创建文件:%s失败\n",file);
  return -2;
 }
 printf("创建文件:%s成功\n",file);
 //创建成功就可以进行文件的复制
 while(1)
 {
  ret=read(src_fd,buf,128);//读取原文件,3个参数,去哪读,读去哪(定义缓存),读多少(实际由缓存大小决定,因为大于缓存时要一直循环)
  if(ret <128)
   break;
  write(des_fd,buf,ret);
 }
 write(des_fd,buf,ret);
 //完成后关闭三个文件
 close(src_fd);
 close(des_fd);
 closedir(dp);//目录流
 
 return 0;
}

代码中用到的字符串连接函数strcat(0用法:
strcat(str1,str2)是将str2的内容接在str1后面,得到str1str2
如str1的内容是"123\o",str2是"45\0",那么strcat(str1,str2)内容输出是"12345\0",即str1的\0被覆盖。(我能理解的一个别人的解释,更详细的自己找)

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值