C语言之文件操作

本文详细介绍了C语言中实现文件读写的关键函数,如fopen、fprintf、fscanf、fwrite和fread,以及fclose用于文件关闭的重要性和用法。通过实例展示了如何使用这些函数进行文件操作,包括打开、写入、读取和关闭文件,以保存和恢复数据。
摘要由CSDN通过智能技术生成

目录

实现文件读写

打开文件fopen函数的用法

写文件fprintf函数的用法

读文件fscanf函数的用法

写文件fwrite函数的用法

读文件fread函数的用法

关闭文件fclose函数的用法


实现文件读写

一直以来,我们学习C语言都是数据的处理,这些数据都是在内存中的。一旦程序结束程序结束退出,数据也将灰飞烟灭。文件操作的实现将帮助我们把数据存储到文件中,既硬盘上的文件,如我们所熟知的txt格式,或其他各种后缀的文件,避免程序结束后数据丢失,实现存储数据的功能,甚至充当“数据库”的功能。

下面详细说明每步的作用及详细办法。

1、打开文件:要读取或写入文件,首先需要打开它。可以使用fopen函数来打开文件。

2、读取文件:在打开文件后,可以使用fscanf、fgets等函数来从文件中读取内容。

3、写入文件:在打开文件后,可以使用fprintf、fputs等函数将数据写入文件。

4、关闭文件:在文件读写完成后,应该使用fclose函数关闭文件,以释放系统资源。

以上就是C语言对文件操作的四个步骤及大致解释,下面将展开详细详解!

打开文件fopen函数的用法

fopen()函数是C语言中用于打开文件的函数,它的原型如下:

FILE *fopen(const char *filename, const char *mode);

其中,filename参数是要打开的文件名(包括路径),mode参数是打开文件的模式。

fopen()函数返回一个指向FILE类型结构体的指针,该指针可以用于后续的文件读写操作。如果打开文件失败,则返回NULL。

mode参数是打开文件的模式,常见的模式有以下几种:

参数作用
r以只读方式打开文件,该文件必须存在。
r+以读/写方式打开文件,该文件必须存在。
rb+以读/写方式打开一个二进制文件,只允许读/写数据。
rt+以读/写方式打开一个文本文件,允许读和写。
w打开只写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。
w+打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。
a以附加的方式打开只写文件。若文件不存在,则会创建该文件;如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF 符保留)。
a+以附加方式打开可读/写的文件。若文件不存在,则会创建该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF符不保留)。
wb以只写方式打开或新建一个二进制文件,只允许写数据。
wb+以读/写方式打开或新建一个二进制文件,允许读和写。
wt+以读/写方式打开或新建一个文本文件,允许读和写。
at+以读/写方式打开一个文本文件,允许读或在文本末追加数据。
ab+以读/写方式打开一个二进制文件,允许读或在文件末追加数据。

下面是一个简单的示例,演示了如何使用fopen()函数打开一个文本文件:

#include <stdio.h>

int main() {
    FILE *fp;
    fp = fopen("file.txt", "r");
    if (fp == NULL) {
        printf("Failed to open file.\n");
        return 1;
    }
    // 文件读写操作
    fclose(fp);
    return 0;
}

在上述示例中,首先使用fopen()函数打开一个名为"file.txt"的文本文件,并指定以只读模式打开。如果打开文件失败,则输出错误信息并退出程序。

接下来,可以在fp指针所指向的文件中进行读写操作。最后,使用fclose()函数关闭文件,以释放系统资源。

需要注意的是,在进行文件操作时,应该检查文件是否成功打开、读取或写入,以及文件是否成功关闭。此外,还应该处理可能出现的错误情况,例如文件不存在或无法访问等。

在实际应用中,还可以使用其他相关函数,如freopen()、fdopen()等,来重新打开文件或将文件描述符转换为FILE类型指针等操作。根据具体需求,可以选择合适的函数和方法来实现文件读写操作。

写文件fprintf函数的用法

fprintf()函数是C语言中用于将格式化数据写入文件的函数,它的原型如下:

int fprintf(FILE *stream, const char *format, ...);

其中,stream参数是指向已打开文件的指针,format参数是格式化字符串,用于指定要写入的数据类型和格式,后续参数是要写入的数据。

fprintf()函数返回成功写入的字符数,如果发生错误则返回一个负值。

控制符作用
%c字符
%d 或 %i有符号十进制整数
%e使用 e 字符的科学科学记数法(尾数和指数)
%E使用 E 字符的科学科学记数法(尾数和指数)
%f十进制浮点数
%g自动选择 %e 或 %f 中合适的表示法
%G自动选择 %E 或 %f 中合适的表示法
%o有符号八进制
%s字符的字符串
%u无符号十进制整数
%x无符号十六进制整数
%X无符号十六进制整数(大写字母)
%p指针地址
%n无输出
%字符

更多的格式可以参照printf的用法中的格式,可以通用。

下面是一个简单的示例,演示了如何使用fprintf()函数将数据写入文件:

#include <stdio.h>

int main() {
    FILE *fp;
    fp = fopen("file.txt", "w");
    if (fp == NULL) {
        printf("Failed to open file.\n");
        return 1;
    }
    
    int num = 10;
    float pi = 3.14159;
    char str[] = "Hello, World!";
    
    fprintf(fp, "Number: %d\n", num);
    fprintf(fp, "Pi: %.2f\n", pi);
    fprintf(fp, "String: %s\n", str);
    
    fclose(fp);
    return 0;
}

在上述示例中,首先使用fopen()函数以写入模式打开一个名为"file.txt"的文本文件。如果打开文件失败,则输出错误信息并退出程序。

接下来,使用fprintf()函数将数据按照指定的格式写入文件。在这个例子中,我们分别写入一个整数、一个浮点数和一个字符串。格式化字符串中的占位符(如%d、%.2f、%s)会被对应的参数值替换。

最后,使用fclose()函数关闭文件,以释放系统资源。

需要注意的是,在进行文件操作时,应该检查文件是否成功打开、读取或写入,以及文件是否成功关闭。此外,还应该处理可能出现的错误情况,例如文件不存在或无法访问等。

除了fprintf()函数,C语言还提供了其他一些用于写入文件的函数,如fputc()、fputs()等。根据具体需求,可以选择合适的函数和方法来实现文件写入操作。

需要注意理解的是,fprintf函数虽然和printf函数很像,表示输出,但准确说是是写入的意思,是指程序向文件里写,要清楚数据的流向。

读文件fscanf函数的用法

fscanf()函数是C语言中用于从文件中读取格式化数据的函数,它的原型如下:

int fscanf(FILE *stream, const char *format, ...);

其中,stream参数是指向已打开文件的指针,format参数是格式化字符串,用于指定要读取的数据类型和格式,后续参数是用于存储读取结果的变量。

fscanf()函数返回成功读取的项目数,如果发生错误则返回一个负值。

更多fscanf的格式如下表:

格式作用
%d读入一个十进制整数
%i读入十进制,八进制,十六进制整数,与%d类似,但是在编译时通过数据前置或后置来区分进制,如加入“0x”则是十六进制,加入“0”则为八进制。例如串“031”使用%d时会被算作31,但是使用%i时会算作25
%u读入一个无符号十进制整数
%f %F %g %G用来输入实数,可以用小数形式或指数形式输入
%x %x 读入十六进制整数
%o读入八进制整数
%s直到遇到一个空格字符(空格字符可以是空白、换行和制表符)
%c单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符

下面是一个简单的示例,演示了如何使用fscanf()函数从文件中读取数据:

#include <stdio.h>

int main() {
    FILE *fp;
    fp = fopen("file.txt", "r");
    if (fp == NULL) {
        printf("Failed to open file.\n");
        return 1;
    }
    
    int num;
    float pi;
    char str[50];
    
    fscanf(fp, "%d", &num);
    fscanf(fp, "%f", &pi);
    fscanf(fp, "%s", str);
    
    printf("Number: %d\n", num);
    printf("Pi: %.2f\n", pi);
    printf("String: %s\n", str);
    
    fclose(fp);
    return 0;
}

在上述示例中,首先使用fopen()函数以只读模式打开一个名为"file.txt"的文本文件。如果打开文件失败,则输出错误信息并退出程序。

接下来,使用fscanf()函数从文件中按照指定的格式读取数据。在这个例子中,我们分别读取一个整数、一个浮点数和一个字符串。格式化字符串中的占位符(如%d、%f、%s)会将文件中的数据解析并存储到对应的变量中。

最后,使用printf()函数将读取到的数据输出到控制台。

需要注意的是,在进行文件操作时,应该检查文件是否成功打开、读取或写入,以及文件是否成功关闭。此外,还应该处理可能出现的错误情况,例如文件不存在或无法访问等。

除了fscanf()函数,C语言还提供了其他一些用于从文件中读取数据的函数,如fgetc()、fgets()等。根据具体需求,可以选择合适的函数和方法来实现文件读取操作。

写文件fwrite函数的用法

fwrite()函数是C语言中用于将数据块写入文件的函数,它的原型如下:

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

其中,ptr参数是指向要写入的数据块的指针,size参数是每个数据项的大小(以字节为单位),count参数是要写入的数据项的数量,stream参数是指向已打开文件的指针。

fwrite()函数返回成功写入的数据项数。如果发生错误或到达文件末尾,则返回一个小于count的值。

下面是一个简单的示例,演示了如何使用fwrite()函数将数据块写入文件:

#include <stdio.h>

struct Person {
    char name[50];
    int age;
};

int main() {
    FILE *fp;
    fp = fopen("file.bin", "wb");
    if (fp == NULL) {
        printf("Failed to open file.\n");
        return 1;
    }
    
    struct Person p1 = {"John", 25};
    struct Person p2 = {"Alice", 30};
    
    fwrite(&p1, sizeof(struct Person), 1, fp);
    fwrite(&p2, sizeof(struct Person), 1, fp);
    
    fclose(fp);
    return 0;
}

在上述示例中,首先使用fopen()函数以二进制写入模式打开一个名为"file.bin"的文件。如果打开文件失败,则输出错误信息并退出程序。

接下来,定义了一个名为Person的结构体,表示一个人的信息,包括姓名和年龄。

然后,创建了两个Person类型的变量p1和p2,并分别初始化它们的值。

使用fwrite()函数将p1和p2的数据块写入文件。sizeof(struct Person)用于获取Person结构体的大小,以字节为单位。通过取地址运算符&获取结构体变量的内存地址。

最后,使用fclose()函数关闭文件,以释放系统资源。

需要注意的是,在进行文件操作时,应该检查文件是否成功打开、读取或写入,以及文件是否成功关闭。此外,还应该处理可能出现的错误情况,例如文件不存在或无法访问等。

除了fwrite()函数,C语言还提供了其他一些用于写入文件的函数,如fputc()、fputs()等。根据具体需求,可以选择合适的函数和方法来实现文件写入操作。

读文件fread函数的用法

与fwrite是一对,fread()函数是C语言中用于从文件中读取数据块的函数,它的原型如下:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

其中,ptr参数是指向存储读取数据的缓冲区的指针,size参数是每个数据项的大小(以字节为单位),count参数是要读取的数据项的数量,stream参数是指向已打开文件的指针。

fread()函数返回成功读取的数据项数。如果发生错误或到达文件末尾,则返回一个小于count的值。

下面是一个简单的示例,演示了如何使用fread()函数从文件中读取数据块:

#include <stdio.h>

struct Person {
    char name[50];
    int age;
};

int main() {
    FILE *fp;
    fp = fopen("file.bin", "rb");
    if (fp == NULL) {
        printf("Failed to open file.\n");
        return 1;
    }
    
    struct Person p1, p2;
    
    fread(&p1, sizeof(struct Person), 1, fp);
    fread(&p2, sizeof(struct Person), 1, fp);
    
    printf("Person 1: %s, %d\n", p1.name, p1.age);
    printf("Person 2: %s, %d\n", p2.name, p2.age);
    
    fclose(fp);
    return 0;
}

在上述示例中,首先使用fopen()函数以二进制读取模式打开一个名为"file.bin"的文件。如果打开文件失败,则输出错误信息并退出程序。

接下来,定义了一个名为Person的结构体,表示一个人的信息,包括姓名和年龄。

然后,创建了两个Person类型的变量p1和p2。

使用fread()函数从文件中读取p1和p2的数据块。sizeof(struct Person)用于获取Person结构体的大小,以字节为单位。通过取地址运算符&获取结构体变量的内存地址。

最后,使用printf()函数将读取到的数据输出到控制台,并使用fclose()函数关闭文件,以释放系统资源。

需要注意的是,在进行文件操作时,应该检查文件是否成功打开、读取或写入,以及文件是否成功关闭。此外,还应该处理可能出现的错误情况,例如文件不存在或无法访问等。

除了fread()函数,C语言还提供了其他一些用于读取文件的函数,如fgetc()、fgets()等。根据具体需求,可以选择合适的函数和方法来实现文件读取操作。

关闭文件fclose函数的用法

fclose()函数用于关闭已打开的文件,切断IO数据流,以释放系统资源并确保文件的正确关闭。它的原型如下:

int fclose(FILE *stream);

其中,stream参数是指向已打开文件的指针。

fclose()函数返回一个整数值,如果成功关闭文件,则返回0;如果关闭文件失败,则返回-1。

下面是一个示例,演示了如何使用fclose()函数关闭文件:

#include <stdio.h>

int main() {
    FILE *fp;
    fp = fopen("file.txt", "r");
    if (fp == NULL) {
        printf("Failed to open file.\n");
        return 1;
    }
    
    // 文件操作...
    
    int result = fclose(fp);
    if (result == 0) {
        printf("File closed successfully.\n");
    } else {
        printf("Failed to close file.\n");
    }
    
    return 0;
}

在上述示例中,首先使用fopen()函数以只读模式打开一个名为"file.txt"的文件。如果打开文件失败,则输出错误信息并退出程序。

接下来,进行文件操作(此处省略具体操作)。

然后,使用fclose()函数关闭已打开的文件。通过传递之前打开文件时返回的文件指针作为参数。

最后,根据fclose()函数的返回值判断文件是否成功关闭,并输出相应的信息。

需要注意的是,在进行文件操作时,应该检查文件是否成功打开、读取或写入,以及文件是否成功关闭。此外,还应该处理可能出现的错误情况,例如文件不存在或无法访问等。

在关闭文件之前,确保已完成对文件的所有操作,以避免数据丢失或不完整的情况。关闭文件后,将无法再对其进行读取或写入操作。

另外,如果程序中有多个文件需要关闭,可以依次使用fclose()函数关闭它们。每个文件都应该有对应的文件指针,并确保在适当的时候关闭它们,以避免资源泄漏。

总结起来,fclose()函数是C语言中用于关闭文件的函数,通过传递文件指针作为参数来关闭已打开的文件。在文件操作完成后,及时关闭文件是良好的编程习惯,可以避免资源浪费和潜在的问题。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SFTP是Secure File Transfer Protocol的缩写,是一种安全的文件传输协议。下面是C语言实现SFTP上传文件的步骤: 1. 引入必要的头文件和库文件,包括libssh2库和WinSock2.h头文件。 2. 初始化socket库,使用initSocket()函数。 3. 建立SFTP连接,使用libssh2_session_init()函数初始化会话,使用libssh2_session_handshake()函数握手建立连接。 4. 认证用户身份,使用libssh2_userauth_password()函数或libssh2_userauth_publickey_fromfile()函数进行密码或公钥认证。 5. 打开本地文件,使用fopen()函数打开本地文件。 6. 创建远程文件,使用libssh2_sftp_open()函数创建远程文件。 7. 读取本地文件内容,使用fread()函数读取本地文件内容。 8. 将本地文件内容写入远程文件,使用libssh2_sftp_write()函数将本地文件内容写入远程文件。 9. 关闭本地文件和远程文件,使用fclose()函数和libssh2_sftp_close()函数。 10. 关闭SFTP连接,使用libssh2_session_disconnect()函数和libssh2_session_free()函数。 下面是一个简单的C语言实现SFTP上传文件的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <libssh2.h> #include <WinSock2.h> #define REMOTE_FILE_PATH "/path/to/remote/file" #define LOCAL_FILE_PATH "C:\\path\\to\\local\\file" int main() { int rc; int sock; struct sockaddr_in sin; const char *username = "username"; const char *password = "password"; const char *remote_file_path = REMOTE_FILE_PATH; const char *local_file_path = LOCAL_FILE_PATH; FILE *local_file; LIBSSH2_SESSION *session; LIBSSH2_SFTP *sftp_session; LIBSSH2_SFTP_HANDLE *sftp_handle; char buffer[1024]; size_t nread; size_t total = 0; // 初始化socket库 rc = WSAStartup(MAKEWORD(2, 2), &wsaData); if (rc != 0) { fprintf(stderr, "WSAStartup failed: %d\n", rc); return 1; } // 建立socket连接 sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { fprintf(stderr, "socket failed: %ld\n", WSAGetLastError()); WSACleanup(); return 1; } // 设置socket地址 sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = inet_addr("192.168.1.1"); // 连接远程主机 rc = connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)); if (rc != 0) { fprintf(stderr, "connect failed: %d\n", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } // 初始化会话 session = libssh2_session_init(); if (session == NULL) { fprintf(stderr, "libssh2_session_init failed\n"); closesocket(sock); WSACleanup(); return 1; } // 握手建立连接 rc = libssh2_session_handshake(session, sock); if (rc != 0) { fprintf(stderr, "libssh2_session_handshake failed: %d\n", rc); libssh2_session_free(session); closesocket(sock); WSACleanup(); return 1; } // 用户名密码认证 rc = libssh2_userauth_password(session, username, password); if (rc != 0) { fprintf(stderr, "libssh2_userauth_password failed: %d\n", rc); libssh2_session_disconnect(session, "Failed to authenticate"); libssh2_session_free(session); closesocket(sock); WSACleanup(); return 1; } // 创建SFTP会话 sftp_session = libssh2_sftp_init(session); if (sftp_session == NULL) { fprintf(stderr, "libssh2_sftp_init failed\n"); libssh2_session_disconnect(session, "Failed to create SFTP session"); libssh2_session_free(session); closesocket(sock); WSACleanup(); return 1; } // 打开本地文件 local_file = fopen(local_file_path, "rb"); if (local_file == NULL) { fprintf(stderr, "fopen failed: %s\n", strerror(errno)); libssh2_sftp_shutdown(sftp_session); libssh2_session_disconnect(session, "Failed to open local file"); libssh2_session_free(session); closesocket(sock); WSACleanup(); return 1; } // 创建远程文件 sftp_handle = libssh2_sftp_open(sftp_session, remote_file_path, LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC, LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH); if (sftp_handle == NULL) { fprintf(stderr, "libssh2_sftp_open failed\n"); fclose(local_file); libssh2_sftp_shutdown(sftp_session); libssh2_session_disconnect(session, "Failed to create remote file"); libssh2_session_free(session); closesocket(sock); WSACleanup(); return 1; } // 读取本地文件内容并写入远程文件 do { nread = fread(buffer, 1, sizeof(buffer), local_file); if (nread <= 0) { break; } rc = libssh2_sftp_write(sftp_handle, buffer, nread); if (rc != nread) { fprintf(stderr, "libssh2_sftp_write failed: %d\n", rc); fclose(local_file); libssh2_sftp_close(sftp_handle); libssh2_sftp_shutdown(sftp_session); libssh2_session_disconnect(session, "Failed to write to remote file"); libssh2_session_free(session); closesocket(sock); WSACleanup(); return 1; } total += nread; } while (1); // 关闭本地文件和远程文件 fclose(local_file); libssh2_sftp_close(sftp_handle); libssh2_sftp_shutdown(sftp_session); // 关闭SFTP连接 libssh2_session_disconnect(session, "Normal shutdown"); libssh2_session_free(session); closesocket(sock); WSACleanup(); printf("Upload succeeded, %d bytes uploaded.\n", total); --相关问题--:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在奋斗的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值