上期我们讲解了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 适用于处理存储在内存中的字符串数据。