C语言 格式化读写文件详解

fscanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能相似,都是格式化读写函数,两者的区别在于 fscanf() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘文件。

这两个函数的原型为:

int fscanf ( FILE *fp, char * format, ... );
int fprintf ( FILE *fp, char * format, ... );

fp 为文件指针,format 为格式控制字符串,... 表示参数列表。与 scanf() 和 printf() 相比,它们仅仅多了一个 fp 参数。例如:

FILE *fp;
int i, j;
char *str, ch;
fscanf(fp, "%d %s", &i, str);
fprintf(fp,"%d %c", j, ch);

fprintf() 返回成功写入的字符的个数,失败则返回负数。fscanf() 返回参数列表中被成功赋值的参数个数。

【示例】用 fscanf 和 fprintf 函数来完成对学生信息的读写。

#include<stdio.h>
#define N 2
struct stu{
  char name[10];
  int num;
  int age;
  float score;
} boya[N], boyb[N], *pa, *pb;
int main(){
  FILE *fp;
  int i;
  pa=boya;
  pb=boyb;
  if( (fp=fopen("D:\\demo.txt","wt+")) == NULL ){
    printf("Cannot open file, press any key exit!");
    getch();
    exit(1);
  }
  //从键盘读入数据,保存到boya
  printf("Input data:\n");
  for(i=0; i<N; i++,pa++){
    scanf("%s %d %d %f", pa->name, &pa->num, &pa->age, &pa->score);
  }
  pa = boya;
  //将boya中的数据写入到文件
  for(i=0; i<N; i++,pa++){
    fprintf(fp,"%s %d %d %f\n", pa->name, pa->num, pa->age, pa->score);
  }
  //重置文件指针
  rewind(fp);
  //从文件中读取数据,保存到boyb
  for(i=0; i<N; i++,pb++){
    fscanf(fp, "%s %d %d %f\n", pb->name, &pb->num, &pb->age, &pb->score);
  }
  pb=boyb;
  //将boyb中的数据输出到显示器
  for(i=0; i<N; i++,pb++){
    printf("%s %d %d %f\n", pb->name, pb->num, pb->age, pb->score);
  }
  fclose(fp);
  return 0;
}

运行结果:

Input data:
Tom 2 15 90.5
Hua 1 14 99
Tom  2  15  90.500000
Hua  1  14  99.000000

打开 D:\\demo.txt,发现文件的内容是可以阅读的,格式非常清晰。用 fprintf() 和 fscanf() 函数读写配置文件、日志文件会非常方便,不但程序能够识别,用户也可以看懂,可以手动修改。

如果将 fp 设置为 stdin,那么 fscanf() 函数将会从键盘读取数据,与 scanf 的作用相同;设置为 stdout,那么 fprintf() 函数将会向显示器输出内容,与 printf 的作用相同。例如:

#include<stdio.h>
int main(){
  int a, b, sum;
  fprintf(stdout, "Input two numbers: ");
  fscanf(stdin, "%d %d", &a, &b);
  sum = a + b;
  fprintf(stdout, "sum=%d\n", sum);
  return 0;
}

运行结果:

Input two numbers: 10 20
sum=3036.html

以上就是对 C语言格式化读写文件的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

(0)

相关推荐

  • C语言 指针与二维数组详解

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 0   1   2   3 4   5   6   7 8   9  10  11 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放 a[

  • C语言 选择排序算法详解及实现代码

    选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直到所有的数从小到大排序. 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换. 下面,以对 3  2  4  1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置. 第1轮 排序过程 (寻找第1小的数所在的位置) 3  2  4  1(最初, m

  • C语言 位域详解及示例代码

    有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可.例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位.正是基于这种考虑,C语言又提供了一种叫做位域的数据结构. 在结构体定义时,我们可以指定某个成员变量所占用的二进制位数(Bit),这就是位域.请看下面的例子: struct bs{ unsigned m; unsigned n: 4; unsigned char ch: 6; } :后面的数字用来限定成员变量占用的位数.成员 m 没有限制,根据

  • C语言 以字符串的形式读写文件详解及示例代码

    fgetc() 和 fputc() 函数每次只能读写一个字符,速度较慢:实际开发中往往是每次读写一个字符串或者一个数据块,这样能明显提高效率. 读字符串函数fgets fgets() 函数用来从指定的文件中读取一个字符串,并保存到字符数组中,它的原型为: char *fgets ( char *str, int n, FILE *fp ); str 为字符数组,n 为要读取的字符数目,fp 为文件指针. 返回值:读取成功时返回字符数组首地址,也即 str:读取失败时返回 NULL:如果开始读取时

  • C语言 文件的随机读写详解及示例代码

    前面介绍的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据.但在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写.这种读写方式称为随机读写,也就是说从文件的任意位置开始读写. 实现随机读写的关键是要按要求移动位置指针,这称为文件的定位. 文件定位函数rewind和fseek 移动文件内部位置指针的函数主要有两个,即 rewind() 和 fseek(). rewind() 用来将位置指针移动到文件开头,前面已经多次使用过,它的原型为

  • C语言 指针数组详解及示例代码

    如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组.指针数组的定义形式一般为: dataType *arrayName[length]; [ ]的优先级高于*,该定义形式应该理解为: dataType *(arrayName[length]); 括号里面说明arrayName是一个数组,包含了length个元素,括号外面说明每个元素的类型为dataType *. 除了每个元素的数据类型不同,指针数组和普通数组在其他方面都是一样的,下面是一个简单的例子: #include <stdi

  • C语言 以字符形式读写文件详解及示例代码

    在C语言中,读写文件比较灵活,既可以每次读写一个字符,也可以读写一个字符串,甚至是任意字节的数据(数据块).本节介绍以字符形式读写文件. 以字符形式读写文件时,每次可以从文件中读取一个字符,或者向文件中写入一个字符.主要使用两个函数:fgetc()和fputc(). 字符读取函数 fgetc fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符.它的原型为: int fgetc (FILE *fp); fp 为文件指针.fgetc() 读取成功时返回读取到的字符,

  • C语言 以数据块的形式读写文件详解及实现代码

    fgets() 有局限性,每次最多只能从文件中读取一行内容,因为 fgets 遇到换行符就结束读取.如果希望读取多行内容,需要使用 fread 函数:相应地写入函数为 fwrite. fread() 函数用来从指定文件中读取块数据.所谓块数据,也就是若干个字节的数据,可以是一个字符,可以是一个字符串,可以是多行数据,并没有什么限制.fread() 的原型为: size_t fread ( void *ptr, size_t size, size_t count, FILE *fp ); fwri

  • C语言 格式化读写文件详解

    fscanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能相似,都是格式化读写函数,两者的区别在于 fscanf() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘文件. 这两个函数的原型为: int fscanf ( FILE *fp, char * format, ... ); int fprintf ( FILE *fp, char * format, ... ); fp 为文件指针,format 为格式控制字符串,... 表示参数

  • Go语言使用读写OPC详解

    注意:当前功能仅在windows下可使用 参考链接:https://github.com/konimarti/opc 命令行窗口必须在管理员权限下打开,不然该命令会无效 环境配置 使用amd64编译的情形 把x64位的gbda_aut.dll文件拷贝到Windows的System32文件夹下 下载地址:http://gray-box.net/download_daawrapper.php?lang=en 进入文件夹执行 regsvr32 gbda_aut.dll 使用386编译的情形 把x32位

  • C语言格式化输入输出函数详解

    一:格式输出函数printf() 1.调用形式一般为:printf("格式化控制字符串",输出表列): 2.格式化控制字符串用于指定输出格式,它有三种形式: 1.格式说明符:规定了相应输出表列内容的输出格式,以%打头,如%d.%o等 2.转义字符:用来输出转义字符所代表的控制代码或者特殊字符,比如常用的'\n'.'\t' 3.普通字符:需要原样输出的字符. 3.输出表列为若干需要输出的数据项,它与格式说明符在数量和类型上一一对应: 4.格式字符m指定输出数据所占宽度,n对实数表示输出n

  • Go语言基础Json序列化反序列化及文件读写示例详解

    目录 概述 JSON序列化 结构体转JSON map转JSON 切片转JSON JSON反序列化 JSON转map JSON转结构体 JSON转切片 写JSON文件 map写入JSON文件 切片写入JSON文件 结构体写入JSON文件 读JSON文件 解码JSON文件为map 解码JSON文件为切片 解码JSON文件为结构体 示例 概述 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的.键值对的数据交换格式.结构由大括号'{}',中括

  • Go语言学习笔记之文件读写操作详解

    目录 文件写 文件读 小结 文件操作比较多,分为几篇来写吧.首先是文件的读写,在平时的工程化操作中使用最多. 文件写 样例代码如下 package main import ( "bufio" "fmt" "io" "os" ) //写文件 func DoWriteFile() error { _filePath := "./test.txt" _file, _err := os.OpenFile(_file

  • Pandas对CSV文件读写操作详解

    目录 什么是 CSV 文件 CSV 库解析 CSV 文件 读取 CSV 文件 CSV reader 参数 CSV 文件的写入 使用 pandas 库解析 CSV 文件 pandas 读取 CSV 文件 pandas 写入 CSV 文件 什么是 CSV 文件 CSV 文件(逗号分隔值文件)是一种纯文本文件,它使用特定的结构来排列表格数据.因为它是一个纯文本文件,所以只能包含实际的文本数据,换句话说就是可打印的 ASCII 或 Unicode 字符. 通常,CSV 文件的结构由其名称给出,使用逗号分

  • Python YAML文件的读写操作详解

    目录 YAML格式 YAML文件 YAML操作 读取 存储 示例 转字典 转列表 YAML是一种数据序列化格式,方便人类阅读,且容易和脚本语言交互.常用于配置文件,也用于数据存储或传输. YAML格式 YAML三种基本数据类型: 1.标量:如字符串.整数和浮点数.日期 布尔值:“true”.“True”.“TRUE”.“yes”.“Yes"和"YES”,“false”.“False”.“FALSE”.“no”.“No"和"NO” 空:null.Null.~或不指定值

随机推荐