linux下,用c语言编程,实现从一个文件读取内容到另一个文件,可以在文件的不同位置修改文件内容,并保存。

         作为一名编程新手,我写这篇文章的目的只是想为自己创建一个知识库,积累一些自己写编程的心得,激励自己在编程路上越走越远,同时也希望能帮到遇到问题的同胞们。不忘初心,方得始终。奋斗奋斗奋斗

这是刚开始我自己摸索写出的程序,但是结果却不是很理想.因为写入的内容是覆盖以前文件的内容,这并不是我想要的

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4
  5
  6 int main(void){
  7     FILE * pFile=fopen("1.docx","r");
  8     FILE * Buffer=fwrite("11.docx","w");
  9     fseek(pFile,0,SEEK_END);
 10     int size=ftell(pFile);
 11     if(pFile!=NULL) {
 12     //seek zhizhen locate//
 13         rewind(pFile);
 14         fseek(pFile,size/2,SEEK_SET);
 15         fwrite("abcd",strlen("abcd"),1,Buffer);
 16         fseek(pFile,0,SEEK_SET);
 17         fwrite("1234",strlen("1234"),1,Buffer);
 18         fseek(pFile,0,SEEK_END);
 19             fwrite("####",strlen("####"),1,Buffer);
 20     }
 21     else
 22     {
 23         printf("can't open file\n");
 24
 25     }
 26     fflush(pFile);
 27     fclose(pFile);
 28     fclose(Buffer);
 29     return  0;
 30 }

后来,我就换了一种方法,此种方法便能实现从一个文件到另外一个文件的拷贝,并且能够对文件内容进行修改,是一边读一边写,虽然有些繁琐,但也是实现了要完成的功能。

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<sys/types.h>
  4 #include<fcntl.h>
  5 #include<string.h>
  6 #include<unistd.h>
  7 #include<errno.h>
  8 #include<sys/stat.h>
  9 #define BUFFER_SIZE 102400
 10 int main(int argc,char const * argv[])
 11 {   
 12     int fd=-1;
 13     int fw=-1;
 14  //   int fr=-1;
 15     struct stat  statbuff;
 16     int size,write_count;
 17     char buffer[BUFFER_SIZE];
 18     int read_bytes;
 19    if((fd=open(argv[1],O_RDWR))>0)
 20        printf("File1 open success!!\n");
 21    if(( fw=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))>0)
 22    {
 23     printf("File2 establish sucess!!\n");
 24    }
 25         stat(argv[1],&statbuff);
 26         size=statbuff.st_size;
 27         write(fw,"1212",4);
 28         read_bytes=read(fd,buffer,size/2);
 29 
//     printf("%d\n",read_count);
 30  //     lseek(fw,0,SEEK_SET);
 31  //     write(fw,"1212",4);
 32  //     while(write(fw,buffer,read_bytes)){
 33 //      stat(argv[1],&statbuff);
 34  //     size=statbuff.st_size;

 35         printf("The size is:%d\n",size);
 36         write_count=write(fw,buffer,size/2);
 37   //    printf("%d\n",write_count);
 38         write(fw,"####",4);
 39         read(fd,buffer,size/2);
 40         write(fw,buffer,size/2);
 41         write(fw,"1234",4);
 42         close(fw);

 43         close(fd);
 44         exit(0);
 45 }

既然我们能添加内容并保存到一个新文件中,自然我们也是能够可以去掉添加的内容,恢复到文件原来的样子。

 1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<sys/types.h>
  4 #include<fcntl.h>
  5 #include<string.h>
  6 #include<unistd.h>
  7 #include<errno.h>
  8 #include<sys/stat.h>
  9 #define BUFFER_SIZE 102400
 10 int main(int argc,char const * argv[])
 11 {
 12  // int fd=-1;
 13     int fw=-1;
 14     int fr=-1;
 15     struct stat statbuff2;
 16     int size2;
 17     char buffer[BUFFER_SIZE];
 18     if((fw=open(argv[1],O_RDWR))>0)
 19        printf("File2 open success!!\n");
 20     if((fr=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))>0)
 21          {
 22             printf("file3 build sucess!!\n");
 23
 24          }
 25     stat(argv[1],&statbuff2);
 26     size2=statbuff2.st_size;
 27     printf("%d \n",size2);
 28     int total_size=strlen("1212")+strlen("####")+strlen("1234");
 29     printf("%d \n",total_size);
 30     int end_size=size2-total_size;
 31     printf("%d\n",end_size);
 32     lseek(fw,4,SEEK_SET);
 33     int read_count=read(fw,buffer,end_size/2);
 34 //    printf("%d \n",read_count);
 35     int write_count= write(fr,buffer,read_count);
 36     lseek(fw,(end_size/2)+4,SEEK_SET);
 37     read(fw,buffer,end_size/2);
 38     write(fr,buffer,end_size/2);
 39     close(fw);
 40     close(fr);
 41     exit(0);
 42 }

注:

open函数用于打开和创建文件。以下是 open函数的简单描述:

       #include<fcntl.h>

       int open(const char *pathname, int oflag, ... );

      返回值:成功则返回文件描述符,否则返回 -1

对于 open函数来说,第三个参数(...)仅当创建新文件时才使用,用于指定文件的访问权限位(accesspermission bits)。pathname 是待打开/创建文件的路径名(如 C:/cpp/a.cpp);oflag用于指定文件的打开/创建模式,这个参数可由以下常量(定义于 fcntl.h)通过逻辑或构成。

O_RDONLY     只读模式
O_WRONLY     只写模式
O_RDWR       读写模式

打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的:

O_APPEND      每次写操作都写入文件的末尾
O_CREAT       如果指定文件不存在,则创建这个文件
O_EXCL        如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
O_TRUNC       如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
O_NOCTTY      如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK    如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继I/O设置为非阻塞模式(nonblocking mode)

以下三个常量同样是选用的,它们用于同步输入输出

O_DSYNC       等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
O_RSYNC       read 等待所有写入同一区域的写操作完成后再进行
O_SYNC        等待物理 I/O 结束后再 write,包括更新文件属性的 I/O

open返回的文件描述符一定是最小的未被使用的描述符。

读写文件

ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);

size_t是unsigned int 表示只能大于等于0
ssize_t是signed int 可以为正,可以为负

  • 关闭文件

int close(int fd);



©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页