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);
这是刚开始我自己摸索写出的程序,但是结果却不是很理想.因为写入的内容是覆盖以前文件的内容,这并不是我想要的。
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);
相关文章推荐
- C语言实现对文件内容进行修改
- linux下c语言实现tail -f功能---实时读取变化文件中的增量内容
- Linux下c语言实现将一个目录下的所有文件和目录复制到另一个目录下
- WPF中控件绑定XML文件,实现修改XML文件即可以改变程序控件内容
- Linux下的C语言编程——系统调用read和write函数实现文件拷贝
- Java用字节输入输出流实现从一个文件到另一个文件的内容追加
- Emeditor脚本实现从一个文件中排除另一个文件中的内容
- SQLite实现不同数据库的表内容复制--从一个数据库把表和内容复制到另一个数据库
- [VB.NET]是否可以用编程动态修改.resx文件
- Linux下C语言实现文件复制
- 编程实现DTD规范对XML文件内容 ...
- Windows7修改hosts提示:您没有权限在此位置中保存文件
- 文件修改自动重新加载内容技术实现
- Linux 下的C语言实现播放WAV文件
- 编程实现DTD规范对XML文件内容 ...
- Linux中.a,.la,.o,.so文件的意义和编程实现
- sed实现直接修改文件内容
- C语言设置文件长度的方法,可以在WIndows和Linux上用
- Linux.Script.如何修改已被调用的只读文件内容
- css实现对背景图片的定位,获得一张图片上不同位置的内容