文件操作(2)

上期我们讲解了fgetc函数和fputc函数,本期我们来讲解剩下几个

1.fgets函数和fputs函数

fgets函数用法

fgets函数用法 :
 fgets 函数用于从指定的流中读取一行或指定字符数的数据。

其函数原型为:char *fgets(char *str, int n, FILE *stream);

该函数从流stream中读取最多n-1个字符(n-1的原因是其会自动在最后补充\0),并存储在str指向的字符数组中,直到遇到换行符、文件结束符或达到最大字符数。

fgets() 函数在执行成功时返回读到的字符串,即其第一个参数(字符数组)的指针。

当出现错误时会返回NULL

具体用法如下:

​
FILE *fp;
char *str;
fp = fopen("道德经.txt", "r");
if (fgets(str, 10, fp) == NULL) {
    printf("无法打开文件!");
    return;
}
fgets(str, 10, fp);
str = "Hello, world!";
fputs(str, fp);
fclose(fp);

​

在上述示例中,首先打开文件道德经.txt,然后使用fgets函数读取最多10个字符(包括换行符和文件结束符),并将其存储在str字符数组中。

接着使用fputs函数将str字符数组中的内容写入文件。最后关闭文件。

 错误处理 :如果在fgets函数中遇到文件结束符或换行符,而未读取完整一行,或者读取的字符数超出了指定的最大字符数,fgets函数将返回NULL。因此,需要在程序中检查返回值,以确保正确处理文件操作。

fputs函数用法 :
 fputs 函数用于将指定的字符串写入文件。

其函数原型为:int fputs(const char *str, FILE *stream);

该函数将str指向的字符串写入指定的文件流stream中。

fputs() 函数用于向文件流中写入一个字符串。当函数成功写入字符串时,它返回一个非负整数。如果函数未能成功写入字符串,则返回EOF(一个符号常量,其值为-1)。这意味着,当fputs()函数执行成功时,返回值将是写入字符串的长度,不包括字符串结束标记符'\0'。如果返回值为EOF,则表示在写入过程中发生了错误。

具体用法如下:

​
FILE *fp;
char *str = "Hello, world!";
fp = fopen("道德经.txt", "w");
if (fputs(str, fp) == EOF){
    printf("无法写入文件!");
    return;
}
fputs(str, fp);
fclose(fp);

​

在上述示例中,首先打开文件道德经.txt进行写入操作,使用fputs函数将字符串"Hello, world!"写入文件。

如果遇到文件结束符或其他错误,fputs函数将返回EOF。因此,需要在程序中检查返回值,以确保正确处理文件操作。

总结来说, fgets 和 fputs 函数分别用于读取和写入文件操作。

 fgets 函数每次读取文件的一行,直到遇到换行符、文件结束符或达到最大字符数;而 fputs 函数则将指定的字符串写入文件,直到遇到文件结束符。

2.fread函数和fwrite函数

fread函数

fread函数用于从文件中读取数据,

其函数原型为:size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

该函数的参数含义如下:

ptr :指向从文件中读取数据的缓冲区指针23。
size :每次读取的数据项大小(以字节为单位)。
count :指示要读取的数据项数量。
stream :指向文件的指针。

fread函数的返回值是实际读取到缓冲区中的数据项数量,可能少于 count 。如果到达文件尾部或发生错误,返回值将为0。

示例

​
int main() {
    FILE *fp;
    char c;
    fp = fopen("道德经.txt", "r");
    if (fp == NULL) {
        perror("Cannot open file");
        return;
    }
    c = fread(NULL, 1, 1, fp);
    printf("The value read is: %d\n", c);
    fclose(fp);
}

​

在这个示例中,我们首先打开文件道德经.txt,然后使用fread函数读取文件中的第一个字节(整数)并打印出来。注意,由于文件中的数据是以字节为单位存取的,因此即使是一个整数,也需要进行正确的字节对齐。

fwrite函数

fwrite函数用于向文件中写入数据,其函数原型为:
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

该函数的参数含义如下:

ptr :指向要写入的数据的缓冲区指针。
size :每次写入的数据项大小(以字节为单位)。
count :要写入的数据项数量。
stream :指向要写入的文件的指针。

fwrite函数的返回值是成功写入的数据项数量。如果写入的数据项数量小于 count ,则可能是由于文件结尾或其他错误导致的。

示例

int main() {
    FILE *fp;
    const char *str = "Hello, world!";
    fp = fopen("道德经.txt", "w");
    if (fp == NULL) {
        perror("Cannot open file");
        return;
    }
    size_t n = fwrite(str, 1, strlen(str), fp);
    printf("The string \"%s\" has been written to the file.\n", n);
    fclose(fp);
}

在这个示例中,我们首先打开文件道德经.txt,然后使用fwrite函数将字符串"Hello, world!"写入文件中。注意,字符串必须以NULL结尾,这是为了告知C标准库函数该字符串的最后一个字节已经处理完毕。

3.printf函数sprintf函数和fprintf函数

printf函数 :
用途 : printf 用于向标准输出流(通常是屏幕)输出格式化的字符串和变量值。
语法 : int printf(const char *format ...); 
参数 :
const char *format ,也称为格式控制字符串,指定了要读取的数据的格式和顺序。

例如, "%d"  表示读取一个整数, "%f"  表示读取一个浮点数, "%c"  表示读取一个字符, "%s"  表示读取一个字符串,直到遇到空白字符为止。

后面的参数 : ... ,也称为可变参数列表,用来接收读取的数据。这些参数的类型应与格式控制字符串中的格式说明符相匹配。

例如,如果格式字符串中有两个 %d ,则需要传递两个整数类型的变量来接收读取的数据。


如果所有的格式控制字符串都成功匹配并输出了相应的参数,则返回值为输出的字符总数。

这是由于 printf  会停止在遇到第一个无法处理的参数时,因此返回值反映了实际处理的参数数量。
遇到错误时,返回值为负数,通常是 -1  或相应的错误代码。

示例 :

printf("Hello, World!\n");

fprintf函数 :
用途 : fprintf 用于将格式化的数据写入到指定的文件流中12。
语法 : int fprintf(FILE *stream, const char *format ,...); 
参数 :
 stream :指向要写入的文件流的指针。可以是标准输出流 stdout ,标准错误流 stderr ,或者是用户自定义的文件指针。
 format :格式化控制串,指定了输出的格式。格式串中的每个百分号 % 开始的序列称为格式说明符,用于指示接下来的参数如何进行格式化。
 

后面的参数 : ... ,也称为可变参数列表,用来接收读取的数据。这些参数的类型应与格式控制字符串中的格式说明符相匹配。


返回值 :写入的字符数,若失败则返回EOF。
示例 :

FILE *file = fopen("道德经.txt", "w");
fprintf(file, "Hello, File!\n");
fclose(file);

sprintf函数 :
用途 : sprintf 用于将格式化的数据写入到一个字符串中1。
语法 : int sprintf(char *buffer, const char *format ,...); 
参数 :
 buffer :目标字符数组,将格式化后的字符串存储于此。
 format :与 printf 中的格式字符串相同。
 后面的参数 : ... ,也称为可变参数列表,用来接收读取的数据。这些参数的类型应与格式控制字符串中的格式说明符相匹配。
返回值 :写入 buffer 的字符数,若失败则返回EOF。

示例 :

char buffer;
sprintf(buffer, "Hello, Buffer!");
printf("%s\n", buffer);

区别总结 :

输出目标 :
 printf :标准输出(屏幕)。
 fprintf :指定文件。
 sprintf :字符数组。
参数 :
 printf :不需要额外的文件指针或字符数组。
 fprintf :需要文件指针 FILE *stream 。
 sprintf :需要目标字符数组 char *buffer 。
返回值 :三者均返回写入的字符数,失败时返回EOF。

这些函数都是格式化输出的重要工具,选择使用哪个取决于具体的输出需求。

4.scanf函数,sscanf函数和fscanf函数

sscanf函数

用法 : sscanf 用于从字符串中读取格式化的数据。它接收一个字符串作为输入源,然后根据提供的格式字符串解析该字符串,并将结果存储到相应的变量中。
语法 : int sscanf(const char *str, const char *format, ...) 

const char *null ,通常表示为 str ,指向要读取数据的字符串。

const char *format ,也称为格式控制字符串,指定了要读取的数据的格式和顺序。

后面的参数 : ... ,也称为可变参数列表,用来接收读取的数据。这些参数的类型应与格式控制字符串中的格式说明符相匹配。

 sscanf  函数返回一个整数值,表示成功匹配并读取的参数个数。如果返回值小于参数的个数,可能表示字符串中的数据已经全部读取完毕或者读取出错。
示例 :

char str[] = "123456";
int num;
sscanf(str, "%d", &num);
printf("num = %d\n", num);

scanf函数

用法 : scanf 用于从标准输入流(通常是键盘)读取格式化的数据12。用户输入的数据被解析并存储到相应的变量中。
语法 : int scanf(const char *format, ...) 

 const char *format ,也称为格式控制字符串,指定了要读取的数据的格式和顺序。

后面的参数 : ... ,这些参数是可变参数,类型应与格式控制字符串中的格式说明符相匹配。

 scanf  函数返回一个整数值,表示成功匹配并读取的参数个数。如果返回值小于参数的个数,可能表示标准输入设备已到达文件尾或读取出现错误。


示例 :

int a, b, c;
printf("请输入 a, b, c: ");
scanf("%d %d %d", &a, &b, &c);
printf("a = %d, b = %d, c = %d\n", a, b, c);

fscanf函数

用法 : fscanf 用于从文件中读取格式化的数据2。它需要一个文件指针作为参数,这个指针通常是指向一个已经打开的文件(例如通过 fopen 函数打开的文件)。数据按照提供的格式字符串被读取并存储到相应的变量中。
语法 : int fscanf(FILE *stream, const char *format, ...) 

 FILE *stream ,通常表示为 fp ,它是一个指向 FILE  类型的指针,指示要读取数据的文件或流。如果是从标准输入读取,可以使用 stdin ;如果是从文件读取,需要先打开文件,并将文件指针赋给 fp ,读取完成后记得关闭文件。


 const char *format ,也称为格式控制字符串,指定了要读取的数据的格式和顺序。


后面的参数 : ... ,也称为可变参数列表,用来接收读取的数据。这些参数的类型应与格式控制字符串中的格式说明符相匹配。

 fscanf  函数返回一个整数值,表示成功匹配并读取的参数个数。如果返回值小于参数的个数,可能表示文件中的数据已经读取完毕或者读取出错。


示例 :

FILE *file;
int num1, num2;
file = fopen("data.txt", "r");
fscanf(file, "%d %d", &num1, &num2);
fclose(file);

区别

输入源 :
 fscanf :从文件中读取数据。
 scanf :从标准输入流(通常是键盘)读取数据。
 sscanf :从字符串中读取数据。
用法场景 :
 fscanf 适用于处理文件输入。
 scanf 适用于处理用户通过键盘输入的数据。
 sscanf 适用于处理存储在内存中的字符串数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值