您的位置:首页 > 运维架构 > Linux

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

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







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


  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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息