9月1日
1.
#include <stdio.h>
#include <stdlib.h>
#define BUF_SIZE 4096
int main(int argc, char *argv[])
{
if (argc != 3) {
printf("用法: %s <源文件> <目标文件>\n", argv[0]);
return 1;
}
FILE *src = fopen(argv[1], "r");
if (src == NULL) {
perror("打开源文件失败");
return 1;
}
FILE *dest = fopen(argv[2], "w");
if (dest == NULL) {
perror("创建目标文件失败");
fclose(src);
return 1;
}
char buffer[BUF_SIZE];
size_t bytes;
while ((bytes = fread(buffer, 1, sizeof(buffer), src)) > 0) {
if (fwrite(buffer, 1, bytes, dest) != bytes) {
perror("写入目标文件失败");
fclose(src);
fclose(dest);
return 1;
}
}
if (ferror(src)) {
perror("读取源文件时出错");
}
fclose(src);
fclose(dest);
printf("文件拷贝完成: %s -> %s\n", argv[1], argv[2]);
return 0;
}
2.
#include <stdio.h>
#include <stdlib.h>
#define BUF_SIZE 4096
int main(int argc, char *argv[])
{
if (argc != 3) {
printf("用法: %s <源文件> <目标文件>\n", argv[0]);
return 1;
}
FILE *src = fopen(argv[1], "r"); // 文本读
if (src == NULL) {
perror("打开源文件失败");
return 1;
}
FILE *dest = fopen(argv[2], "w"); // 文本写
if (dest == NULL) {
perror("创建目标文件失败");
fclose(src);
return 1;
}
char buffer[BUF_SIZE];
char outbuf[BUF_SIZE]; // 存放过滤后的数字
size_t bytes, outbytes;
while ((bytes = fread(buffer, 1, sizeof(buffer), src)) > 0) {
outbytes = 0;
// 判断是否是数字字符
for (size_t i = 0; i < bytes; i++) {
if (buffer[i] >= '0' && buffer[i] <= '9') {
outbuf[outbytes++] = buffer[i];
}
}
if (outbytes > 0) {
if (fwrite(outbuf, 1, outbytes, dest) != outbytes) {
perror("写入目标文件失败");
fclose(src);
fclose(dest);
return 1;
}
}
}
if (ferror(src)) {
perror("读取源文件时出错");
}
fclose(src);
fclose(dest);
printf("数字提取完成: %s -> %s\n", argv[1], argv[2]);
return 0;
}
3.
#include <myhead.h>
#define BUF_SIZE 4096
int main(int argc, const char *argv[])
{
if (argc != 3) {
printf("用法: %s <源文件> <目标文件>\n", argv[0]);
return 1;
}
int src_fd = open(argv[1], O_RDONLY);
if (src_fd < 0) {
perror("打开源文件失败");
return 1;
}
int dest_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (dest_fd < 0) {
perror("创建目标文件失败");
close(src_fd);
return 1;
}
char buffer[BUF_SIZE];
ssize_t bytes_read, bytes_written;
while ((bytes_read = read(src_fd, buffer, sizeof(buffer))) > 0) {
bytes_written = write(dest_fd, buffer, bytes_read);
if (bytes_written != bytes_read) {
perror("写入目标文件失败");
close(src_fd);
close(dest_fd);
return 1;
}
}
if (bytes_read < 0) {
perror("读取源文件失败");
}
close(src_fd);
close(dest_fd);
printf("文件拷贝完成: %s -> %s\n", argv[1], argv[2]);
return 0;
}
区别,文件io没有缓冲区,标准io有,联系,标准io是建立在文件io之上的。