当前位置:   article > 正文

C文件操作——格式化字符串 读写函数 fprintf()和fscanf()_格式化读写函数

格式化读写函数

文章目录:

一:格式化读取函数fprintf()

1.语法

2.参数

2.1 flags(标志,可选)的内容即含义如下:

 2.2 width(宽度,可选)是一个数值,用于指定最小字段的宽度

2.3 specifier(转换字符,必选)的内容及含义如下:

2.4 .precision(.精度,可选),通过点号(.)分隔字段的宽度和精度

2.5 length(长度修饰符,可选)的值可以是 h、hh、l、ll 或 L

2.6 附加参数

3.返回值

4.代码实现

 二:格式化写入函数fscanf()

1.语法

2.参数 

3.返回值

4.代码实现


  1. 函数调用:
  2. fprintf ( 文件指针,格式字符串,输出表列);
  3. fscanf ( 文件指针,格式字符串,输入表列);
  4. 函数功能: 从磁盘文件中按格式读入或输出字符。
  5. 例如:
  6. fprintf(fp, "%d,%6.2f", i, t);
  7. fscanf (fp, "%d,%f", &i, &t);

一:格式化读取函数fprintf()

fprintf 函数用于打印格式化字符串到指定的文件

1.语法

  1. #include <stdio.h>
  2. ...
  3. int fprintf(FILE *stream, const char *format, ...);

2.参数

  1. 1、stream 参数
  2. 该参数是一个 FILE 对象的指针,指定一个待操作的数据流。
  3. 2format 参数
  4. format 参数是一个格式化字符串,由格式化占位符和普通字符组成。
  5. 格式化占位符(以 % 开头)用于指明输出的参数值如何格式化。
  6. 格式化占位符的语法如下:
  7. %[flags][width][.precision][length]specifier
  8. 每一个格式化占位符均以 % 开始,以转换字符结束。

2.1 flags(标志,可选)的内容即含义如下:

标志

含义

-

指定被转换的参数在其字段内左对齐(默认是右对齐)

+

指定在输出的数前面加上正负号

空格

如果第一个字符不是正负号,则在其前面加上一个空格

0

对于数值转换,当输出长度小于字段宽度时,添加前导 0 进行填充

#

指定另一种输出形式:
1. 如果转换字符为 o,则第一个数字为 0
2. 如果转换字符为 x 或 X,则指定在输出的非 0 值钱加 0x 或 0X
3. 对于转换字符为 e、E、f、g 或 G 的情况,指定输出总是包含一个小数点。另外,对于转换字符为 g 或 G,还指定输出值尾部无意义的 0 将被保留
注:flags 可同时出现多个,且无顺序要求。

 2.2 width(宽度,可选)是一个数值,用于指定最小字段的宽度

  1. 转换后的参数输出宽度至少要达到这个数值
  2. 如果参数的字符数小于该数值,则在参数左边(如果 flags 设置为 -,要求左对齐的话则在右边)填充一些字符
  3. 填充字符通常为空格,但是如果 flags 设置为 0,则填充字符为数字 0

2.3 specifier(转换字符,必选)的内容及含义如下:

转换字符

参数类型;转换结果

c

char;字符

d

int;有符号十进制整数

i

同上

e

double;以指数形式输出单、双精度浮点数(小写 e)

E

同上(大写 E)

f

double;以小数形式输出单、双精度浮点数

g

double;以 %f 或 %e 中较短的输出宽度输出单、双精度浮点数(指数显示小写 e)

G

同上(指数显示大写 E)

o

unsigned int;无符号八进制(无前导 0)

s

char *;字符串

u

int;无符号十进制

x

unsigned int;无符号十六进制(无前导 0x)

X

同上(无前导 0X)

p

void *;指针值

n

int *;存放已写字符的个数

%

不进行参数转换;% 自身
注:如果 % 后边的字符不是转换字符,则其行为没有定义

2.4 .precision(.精度,可选),通过点号(.)分隔字段的宽度和精度

  1. 对于字符串,它指定打印的字符的最大个数
  2. 对于整数,它指定打印的数字位数(必要时可加填充位 0 以达到宽度要求)
  3. 对于转换字符为 e、E 或 f,它指定打印的小数点后的数字位数
  4. 对于转换字符为 g 或 G,它指定打印的有效数字位数

2.5 length(长度修饰符,可选)的值可以是 h、hh、l、ll 或 L

星号(*)、width 和 length 是可选的。

  • 星号(*)表示读取但忽略(读取但不保存);
  • width 指定当前读取操作的最大字符数;
  • length 是用于限定不同类型的宽度,具体请参考下表:
  1. hh 表示将相应的参数按 signed charunsigned char 类型输出
  2. h 表示将相应的参数按 shortunsigned short 类型输出
  3. l 表示将相应的参数按 longunsigned long 类型输出
  4. ll 表示将相应的参数按 long longunsigned long long 类型输出
  5. L 表示将相应的参数按 long double 类型输出

length

d 或 i

u、o 或 x

f、e、g 或 a

c、s、[] 或 [^]

p

n

默认

int*

unsigned int*

float*

char*

void**

int*

hh

signed char*

unsigned char*

signed char*

h

short int*

unsigned short int*

short int*

l

long int*

unsigned long int*

double*

wchar_t*

long int*

ll

long long int*

unsigned long long int*

long long int*

j

intmax_t*

uintmax_t*

intmax_t*

z

size_t*

size_t*

size_t*

t

ptrdiff_t*

ptrdiff_t*

ptrdiff_t*

L

long double*

2.6 附加参数

该参数的个数由格式化字符串决定
每个参数的值应当与前面格式化字符串中的占位符类型和位置一一对应

3.返回值

  1. 如果函数调用成功,返回值是实际打印的字符数(不包含表示字符串结束的 '\0');
  2. 如果函数调用失败,返回值是一个负数。

4.代码实现

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(void)
  4. {
  5. FILE *fp;
  6. if ((fp = fopen("file.txt", "w")) == NULL)
  7. {
  8. printf("打开文件失败!\n");
  9. exit(EXIT_FAILURE);
  10. }
  11. fprintf(fp, "I love FishC.com!\n");
  12. fprintf(fp, "Today is %d-%d-%d\n", 2017, 7, 16);
  13. fclose(fp);
  14. return 0;
  15. }

 二:格式化写入函数fscanf()

fscanf 函数用于从指定文件中读取格式化字符串

1.语法

  1. #include <stdio.h>
  2. ...
  3. int fscanf(FILE *stream, const char *format, ...);

2.参数 

  1. 1、stream 参数
  2. 该参数是一个 FILE 对象的指针,指定一个待操作的数据流。
  3. 2format 参数
  4. format 参数是一个格式化字符串,由格式化占位符和普通字符组成。
  5. 该格式化字符串指定如何处理读取到的数据:
  6. 空白字符:该函数将读取并忽略空白字符(空白字符包含空格、回车和制表符);
  7. 除了格式占位符(% 开头)外的非空白字符:指定函数必须从输入流中读取到的字符,如果读取不匹配,则函数调用失败,并从匹配失败处截断输入流;
  8. 格式化占位符(% 开头):用于指明获取的数据类型及位置。

该参数的个数由格式化字符串决定

每个参数均为一个存储空间,并与面格式化字符串中占位符的类型和位置一一对应

如果是一个普通的变量名,应在其名字前边加上 & 符号 

3.返回值

  1. 如果函数调用成功,返回值是成功获取并填充到附加参数中的个数
  2. 如果函数调用失败,返回值小于附加参数的个数(甚至是 0
  3. 如果读取到标准输入流的结尾处,则返回 EOF

4.代码实现

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(void)
  4. {
  5. FILE *fp;
  6. int year, month, day;
  7. if ((fp = fopen("file.txt", "r")) == NULL)
  8. {
  9. printf("打开文件失败!\n");
  10. exit(EXIT_FAILURE);
  11. }
  12. fscanf(fp, "%d-%d-%d", &year, &month, &day);
  13. printf("%d-%d-%d\n", year, month, day);
  14. fclose(fp);
  15. return 0;
  16. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/852549
推荐阅读
相关标签
  

闽ICP备14008679号