c语言 file handling
时间: 2023-09-17 21:01:15 浏览: 48
C语言中的文件处理是指通过使用文件操作函数来读取和写入文件的过程。文件处理允许我们从外部文件中读取数据,或将数据写入到外部文件中。
在C语言中,可以使用`fopen()`函数打开一个文件。该函数有两个参数,第一个参数是文件名,第二个参数是打开文件的模式(如读取、写入等)。成功打开文件后,`fopen()`函数将返回一个指向文件的指针。
读取文件内容时,我们可以使用`fscanf()`或`fgets()`等函数。`fscanf()`函数根据指定的格式读取文件中的数据,而`fgets()`函数逐行读取文件内容。读取文件后,可以将数据赋值给相应的变量,并对其进行操作。
写入文件时,可以使用`fprintf()`函数。该函数有两个参数,第一个参数是要写入数据的文件指针,第二个参数是要写入的内容。`fprintf()`函数将指定的内容写入到文件中。
当处理完成后,我们需要使用`fclose()`函数来关闭文件。关闭文件可以释放系统资源,并确保文件操作的顺利进行。
除了打开、关闭、读取和写入文件的基本操作外,C语言中还提供了其他一些功能函数,如`fseek()`函数可以设置文件指针的位置,`feof()`函数可以检测文件是否已经结束等。
文件处理是C语言中非常重要的一部分,它可以让我们方便地读取和写入文件,从而处理大量的数据。良好的文件处理技巧可以提高程序的效率和可维护性。
相关问题
用C语言写一个IIC
C语言写I2C通讯程序的代码如下:
```
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>
int main()
{
int file;
int adapter_nr = 1; /* probably dynamically determined */
char filename[20];
snprintf(filename, 19, "/dev/i2c-%d", adapter_nr);
file = open(filename, O_RDWR);
if (file < 0) {
/* ERROR HANDLING; you can check errno to see what went wrong */
return 1;
}
int addr = 0x40; /* The I2C address */
if (ioctl(file, I2C_SLAVE, addr) < 0) {
/* ERROR HANDLING; you can check errno to see what went wrong */
return 1;
}
/* Write a single byte to the slave */
char buf[10] = {0};
buf[0] = 0xAA;
if (write(file, buf, 1) != 1) {
/* ERROR HANDLING: i2c transaction failed */
return 1;
}
/* Read from the slave */
if (read(file, buf, 1) != 1) {
/* ERROR HANDLING: i2c transaction failed */
return 1;
}
/* Do something with the data */
printf("Read: 0x%02X\n", buf[0]);
close(file);
return 0;
}
```
该代码实现了一个简单的I2C通讯程序,将一个字节数据写入从设备,并从从设备读取一个字节数据。该代码仅作为示例,可能需要根据实际应用情况进行修改。
C语言编写ftp客户端源代码
以下是一个简单的FTP客户端的C语言源代码,可以连接到FTP服务器并执行文件上传和下载操作。需要注意的是,这个代码仅是一个基础版本,可能需要根据实际情况进行修改和扩展。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#define BUF_SIZE 1024
#define FTP_PORT 21
void error_handling(char *message);
int main(int argc, char *argv[]) {
int sock;
struct sockaddr_in serv_addr;
char buf[BUF_SIZE];
char command[BUF_SIZE];
char filename[BUF_SIZE];
int str_len, recv_len, recv_cnt;
FILE *fp;
int fd;
int mode = 0;
if(argc != 3) {
printf("Usage: %s <IP> <PORT>\n", argv[0]);
exit(1);
}
/* 创建套接字 */
sock = socket(PF_INET, SOCK_STREAM, 0);
if(sock == -1)
error_handling("socket() error");
/* 初始化服务器地址结构体 */
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(FTP_PORT);
/* 连接服务器 */
if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
error_handling("connect() error!");
printf("Connected to FTP server!\n");
/* 接收服务器的欢迎信息 */
recv_len = 0;
while(recv_len < BUF_SIZE) {
recv_cnt = read(sock, &buf[recv_len], 1);
if(recv_cnt == -1)
error_handling("read() error!");
recv_len += recv_cnt;
if(buf[recv_len-1] == '\n') {
buf[recv_len] = '\0';
break;
}
}
printf("%s", buf);
/* 输入用户名和密码 */
printf("Input username: ");
fgets(buf, BUF_SIZE, stdin);
sprintf(command, "USER %s", buf);
write(sock, command, strlen(command));
recv_len = read(sock, buf, BUF_SIZE);
buf[recv_len] = '\0';
printf("%s", buf);
printf("Input password: ");
fgets(buf, BUF_SIZE, stdin);
sprintf(command, "PASS %s", buf);
write(sock, command, strlen(command));
recv_len = read(sock, buf, BUF_SIZE);
buf[recv_len] = '\0';
printf("%s", buf);
/* 进入被动模式 */
write(sock, "PASV", strlen("PASV"));
recv_len = read(sock, buf, BUF_SIZE);
buf[recv_len] = '\0';
printf("%s", buf);
sscanf(buf, "227 Entering Passive Mode (%d,%d,%d,%d,%d,%d)",
&serv_addr.sin_addr.s_addr,
&serv_addr.sin_addr.s_addr + 1,
&serv_addr.sin_addr.s_addr + 2,
&serv_addr.sin_addr.s_addr + 3,
&serv_addr.sin_port,
&serv_addr.sin_port + 1);
serv_addr.sin_addr.s_addr = htonl(serv_addr.sin_addr.s_addr);
serv_addr.sin_port = htons(serv_addr.sin_port);
/* 进入命令循环 */
while(1) {
printf("ftp> ");
fgets(command, BUF_SIZE, stdin);
command[strlen(command)-1] = '\0';
/* 处理QUIT命令 */
if(strcmp(command, "QUIT") == 0) {
write(sock, "QUIT", strlen("QUIT"));
recv_len = read(sock, buf, BUF_SIZE);
buf[recv_len] = '\0';
printf("%s", buf);
break;
}
/* 处理LIST命令 */
else if(strcmp(command, "LIST") == 0) {
/* 连接数据端口 */
int data_sock = socket(PF_INET, SOCK_STREAM, 0);
if(data_sock == -1)
error_handling("socket() error");
if(connect(data_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
error_handling("connect() error!");
/* 执行LIST命令 */
write(sock, "LIST", strlen("LIST"));
recv_len = read(sock, buf, BUF_SIZE);
buf[recv_len] = '\0';
printf("%s", buf);
/* 接收数据 */
while(1) {
recv_len = read(data_sock, buf, BUF_SIZE);
if(recv_len == 0)
break;
fwrite(buf, 1, recv_len, stdout);
}
/* 关闭数据连接 */
close(data_sock);
recv_len = read(sock, buf, BUF_SIZE);
buf[recv_len] = '\0';
printf("%s", buf);
}
/* 处理GET命令 */
else if(strncmp(command, "GET ", 4) == 0) {
sscanf(command, "GET %s", filename);
/* 连接数据端口 */
int data_sock = socket(PF_INET, SOCK_STREAM, 0);
if(data_sock == -1)
error_handling("socket() error");
if(connect(data_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
error_handling("connect() error!");
/* 执行RETR命令 */
sprintf(buf, "RETR %s", filename);
write(sock, buf, strlen(buf));
recv_len = read(sock, buf, BUF_SIZE);
buf[recv_len] = '\0';
printf("%s", buf);
/* 接收文件 */
fp = fopen(filename, "wb");
while(1) {
recv_len = read(data_sock, buf, BUF_SIZE);
if(recv_len == 0)
break;
fwrite(buf, 1, recv_len, fp);
}
printf("File download complete!\n");
/* 关闭数据连接 */
fclose(fp);
close(data_sock);
recv_len = read(sock, buf, BUF_SIZE);
buf[recv_len] = '\0';
printf("%s", buf);
}
/* 处理PUT命令 */
else if(strncmp(command, "PUT ", 4) == 0) {
sscanf(command, "PUT %s", filename);
/* 连接数据端口 */
int data_sock = socket(PF_INET, SOCK_STREAM, 0);
if(data_sock == -1)
error_handling("socket() error");
if(connect(data_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
error_handling("connect() error!");
/* 执行STOR命令 */
sprintf(buf, "STOR %s", filename);
write(sock, buf, strlen(buf));
recv_len = read(sock, buf, BUF_SIZE);
buf[recv_len] = '\0';
printf("%s", buf);
/* 上传文件 */
fp = fopen(filename, "rb");
if(fp == NULL) {
printf("File not found!\n");
continue;
}
while(1) {
str_len = fread(buf, 1, BUF_SIZE, fp);
if(str_len < BUF_SIZE) {
write(data_sock, buf, str_len);
break;
}
write(data_sock, buf, BUF_SIZE);
}
printf("File upload complete!\n");
/* 关闭数据连接 */
fclose(fp);
close(data_sock);
recv_len = read(sock, buf, BUF_SIZE);
buf[recv_len] = '\0';
printf("%s", buf);
}
/* 处理其他命令 */
else {
write(sock, command, strlen(command));
recv_len = read(sock, buf, BUF_SIZE);
buf[recv_len] = '\0';
printf("%s", buf);
}
}
/* 关闭套接字 */
close(sock);
return 0;
}
void error_handling(char *message) {
perror(message);
exit(1);
}
```
这个代码包含了常见的FTP命令,包括登录、退出、列出文件列表、上传文件、下载文件等。需要注意的是,这个代码中使用了被动模式来连接数据端口,如果FTP服务器不支持被动模式,你可能需要修改代码来使用主动模式。此外,该代码还没有进行错误处理,你可能需要在实际使用中进行修改和完善。