目录
一、知识点
二、代码
一、知识点
1.系统命令、API、系统调用层次结构
2.文件表在内存,与进程同级别;
文件描述符算系统资源,若不关闭文件,文件表和描述符都会耗尽;
3.系统调用:
1)creat()创建的文件只能写不能读
2)open()有则打开无则creat();只读打开后可以追加可写O_APPEND;
3) read()返回读取字节数,大小 0<= return <= lengths ;
【read和write都可能部分读,即至少读一个】
【1.常规文件不堵塞; 2.终端(换行结束)和 网络可能堵塞;3设置文件不堵塞后,要轮询】
close(文件描述符)
4.C库函数
1.Windows下添加getchar()防止过屏被闪掉
2.fseek等价于lseek调整文件读取指针位置
5.如果一个函数调用无法从其返回值上判断是否发生了错误时,那么将只能通过 errno 的值来判断是否出错以及出错的原因。对于这种情况,必须在调用函数之前先将 errno 的值手动清零
int main(void)
{
errno=0;
FILE *fp = fopen("test.txt","r");
if(errno!=0)
{
printf("errno值: %dn",errno);
printf("错误信息: %sn",strerror(errno));
}
}
二、代码
1.系统调用复制文件
#include#include #include #include #include #include #include #define BUFFER_SIZE 1024 int main(int argc, char **argv) { int from_fd, to_fd; int bytes_read, bytes_write; char buffer[BUFFER_SIZE]; // 部分写 char *ptr = NULL; int ret; if (3 != argc) { printf("need from file and to filen!n"); exit(0); } from_fd = open(argv[1], O_RDONLY); if (-1 == from_fd) { perror("open from file error!n"); exit(-1); } // 因为create所以有第三个参数mode if ((to_fd = open(argv[2], O_WRonLY | O_CREAT, S_IWUSR | S_IRGRP | S_IRUSR)) == -1) { perror("open to file error!n"); close(from_fd); exit(-1); } while (bytes_read = read(from_fd, buffer, BUFFER_SIZE)) { if (-1 == bytes_read) { perror("read from file! file copy fail!n"); break; } else if (bytes_read > 0) { ptr = buffer; while (bytes_write = write(to_fd, buffer, bytes_read)) { if (-1 == bytes_write) { perror("write error! file copy fail!n"); // 多重最好goto break; } else if (bytes_write == bytes_read) { break; } else { bytes_read = bytes_read - bytes_write; ptr = ptr + bytes_write; } } if (-1 == bytes_write) { break; } } } close(from_fd); close(to_fd); return 0; }
2.库函数文件两个数相加
#include#include #include int main() { FILE *fp1; FILE *fp2; FILE *fp3; if ((fp1 = fopen("c1.txt", "r")) == NULL) { printf("Cannot open file1!n"); exit(1); } if ((fp2 = fopen("c2.txt", "r")) == NULL) { printf("Cannot open file2!n"); exit(1); } if ((fp3 = fopen("c3.txt", "w")) == NULL) { printf("Cannot open file3!n"); exit(1); } char ch1; char ch2; char ch3_1; char ch3_2; ch1 = fgetc(fp1); ch2 = fgetc(fp2); int num1; int num2; int num3; while (ch1 != EOF && ch2 != EOF) { if (ch1 < '0' || ch1 > '9' || ch2 < '0' || ch2 > '9') { num1 = 0; num2 = 0; fputc(ch1, fp3); } else { num1 = num1 * 10 + (ch1 - '0'); num2 = num2 * 10 + (ch2 - '0'); if (num1 > 9 || num2 > 9) { num3 = num1 + num2; ch3_1 = ((num3 % 10) + '0'); ch3_2 = ((num3 / 10) + '0'); fputc(ch3_1, fp3); fputc(ch3_2, fp3); } } ch1 = fgetc(fp1); ch2 = fgetc(fp2); } fclose(fp1); fclose(fp2); fclose(fp3); return 0; }



