C输入输出综述 6.1c输入输出综述 入输出操作是由函数来实现的 C语言函数库中有“标准输入输出函数 字符的输入与输出: getchar(、 putchar0 字符串的输入与输出 tso tso 格式输入与输出: scanf(、 printf 在使用C语言库函数时,要用预编译命令“# include”将有关的“头文件”包括到用户源文件 例如:使用标准输入输出库函数时,要用到“ stdio.h”文件,在源文件开头应有 # include或# include“ stdio.h” (一)字符数据的输入输出 字符输出函数 语法: putchar(c) 语义:(向 stdout终端)输出一个字符 如:# include maIn putchar(141’) putchar(‘a’); putchar(‘A’+32) putchar(‘n’); 2、字符输入函数 语法: getchar(),是一个无参函数 语义:(从 stdin终端上)输入一个字符 getchar包含在 stdio.h中,是 stdio.h中定义的宏;
C 输入输出综述 6 . 1 C 输入输出综述 输入输出操作是由函数来实现的 C 语言函数库中有“标准输入输出函数” 字符的输入与输出:getchar()、putchar() 字符串的输入与输出: gets() 、puts() 格式输入与输出: scanf() 、printf() 在使用 C 语言库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件 中。 例如:使用标准输入输出库函数时,要用到“stdio.h”文件,在源文件开头应有: #include 或 #include “stdio.h” (一)字符数据的输入输出 1、字符输出函数——putchar 语法:putchar(c) 语义:(向 stdout 终端)输出一个字符; 如:#include main() { putchar(‘\141’); putchar(‘a’); putchar(‘A’+32); putchar(‘\n’); } 输 出:aaa 2、字符输入函数——getchar 语法:getchar ( ),是一个无参函数; 语义:(从 stdin 终端上) 输入一个字符; getchar 包含在 stdio.h 中,是 stdio.h 中定义的宏;
Ind in 从键盘上输入一串字符遇“#’结束,若字符在a~z之间时,则输出字符的大写:否则直接 输出字符。 (二)格式输入与输出 格式输出函数— printf 语法: printf(“格式控制”,输出表列) 格式控制:是用双引号括起来的字符串,包含两种信息: 普通字符和转义字符(这类字符总是原样输出) 格式说明:由%和格式控制符组成。 若a、b的值分别为2和3,则输出结果为:a=2,b=3 格式输入函数 语法: scanf(“格式控制”,地址表列) 格式控制:包含三类符号 空白字符:(空格、Tab或\t、\n),输入时不必一一对应 普通字符:(非格式转换说明符、非空白符、非%),输入时必须一一对应 格式转换说明符 (由%后接一个任选的压缩指示符“*”,表示本输入项在读入后不赋给相应的变量) main
如:#include main( ) { putchar(getchar( )); } 从键盘上输入一串字符遇‘#’结束,若字符在 a~z 之间时,则输出字符的大写;否则直接 输出字符。 (二) 格式输入与输出 1、格式输出函数——printf 语法:printf (“格式控制”, 输出表列); 格式控制:是用双引号括起来的字符串,包含两种信息: 普通字符和转义字符(这类字符总是原样输出) 格式说明:由%和格式控制符组成。 如:%d, %f 等;(P77) 如:printf(“a=%d, b=%d”,a,b); 若 a、b 的值分别为 2 和 3,则输出结果为: a=2, b=3 2、格式输入函数 scanf 语法:scanf(“格式控制”,地址表列); 格式控制:包含三类符号 空白字符:(空格、Tab 或\t、\n),输入时不必一一对应; 普通字符:(非格式转换说明符、非空白符、非%),输入时必须一一对应; 格式转换说明符: (由%后接一个任选的压缩指示符“*”,表示本输入项在读入后不赋给相应的变量) 例 1:#include main()
f int a; float b: char str[50] anf(“%d%f%s”,&a,&b,str); 意: scanf函数规定,组成输入项表的输入对象须是地址量;如 scanf(“%d,%d,%d”,&a,&b,&c); scanf(“a=%d,b=%d,c=%d”,&a,&b,&c) ①第一个输入语句,正确的输入数据流为:123,456,789,处理的结果为: 123→a,456→b, 89→c ②同理对第二个输入语句,正确的输入数据流应是:a=123,b=456,c=789 该输入数据流中除123,456,789被赋给相应变量外,其余都被丢弃 文件概述 6.2文件概述 在C语言中,没有输入输出语句,对文件的读写都是用库函数来实现的。ANSI规 了标准输入输出函数,用它们对文件进行读写 为方便起见,操作系统(如UNIX,D0S)通常都把计算机系统中的设备抽象成文件 如把键盘抽象成输入文件,把显示器抽象成输出文件。在语言中只与文件打交道,而不必关心具体的 备,使用的文件都是逻辑意义上的文件。与此相应,所有设备都是逻辑概念上的设备。I/0函数库中 的函数都是针对文件或逻辑设备而言的。 C语言把文件看成是一个字符(字节)的序列。按数据的组织形式,分为AI文 和二进制文件。前者每一个字节存放一个 ASCII字符,后者把内存中的数据按其在内存重的存储形 远洋输出到磁盘上存放。前者占空间多,需要转换,后者节省空间和转换时间,但一个字节不对应 个字符,不能直接输出字符形式
{ int a; float b; char str[50]; scanf(“%d%f%s”,&a,&b,str); …… } 注意:scanf 函数规定,组成输入项表的输入对象须是地址量;如: scanf(“%d,%d,%d”,&a,&b,&c); scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); ①第一个输入语句,正确的输入数据流为:123,456,789,处理的结果为: 123→a,456→b, 789→c ②同理对第二个输入语句,正确的输入数据流应是:a=123,b=456,c=789 该输入数据流中除 123,456,789 被赋给相应变量外,其余都被丢弃 文件概述 6 . 2 文件概述 在 C 语言中,没有输入输出语句,对文件的读写都是用库函数来实现的。ANSI 规 定了标准输入输出函数,用它们对文件进行读写。 为方便起见,操作系统(如 UNIX,DOS)通常都把计算机系统中的设备抽象成文件。 如把键盘抽象成输入文件,把显示器抽象成输出文件。在语言中只与文件打交道,而不必关心具体的 设备,使用的文件都是逻辑意义上的文件。与此相应,所有设备都是逻辑概念上的设备。I/O 函数库中 的函数都是针对文件或逻辑设备而言的。 C 语言把文件看成是一个字符(字节)的序列。按数据的组织形式,分为 ASCII 文 件和二进制文件。前者每一个字节存放一个 ASCII 字符,后者把内存中的数据按其在内存重的存储形 式远洋输出到磁盘上存放。前者占空间多,需要转换,后者节省空间和转换时间,但一个字节不对应 一个字符,不能直接输出字符形式
C语言中可利用高级I/0库函数来存取文件,存取文件的过程与其他语言中的处 理过程类似。通常按如下顺序进行: 打开文件 读写文件(若干次) 关闭文件 这个处理顺序表明:一个文件被存取之前首先要打开它,只有文件被打开后才能进行 读/写操作,文件读/写完毕后必须关闭 文件类指针与文件的打开、关闭 6.3文件类推针与文件的打开、关闭 文件的打开 在操作系统中,每一个文件都有一个名字以供识别,如存储在磁盘上的C源程序文件 ile1.c,file2.c等。文件名是文件的外部名,通过它可以找到文件的实际存储设备、位置、大 特性等诸如此类的相关信息。这些信息只能由操作系统的文件管理系统掌握与管理,因此要存取 文件必须通过操作系统的文件系统。这意味着一个C语言程序没有直接通过文件的外部名存取一个外 部文件的能力,程序中要存取文件必须与文件系统取得联系,把要存取文件的有关信息和要求,诸如 文件的名字、读文件还是写文件、以何种方式读/写等告诉文件系统,由文件系统在设备中建立、寻 找、定位文件,分配存取文件的缓冲区,做好存取文件要求的一切准备工作 上述存取文件的有关信息和要求都由程序通过I/0库函数 fopen告诉操作系统。 fopen函数的一般调用形式是
C 语言中可利用高级 I/O 库函数来存取文件,存取文件的过程与其他语言中的处 理过程类似。通常按如下顺序进行: … 打开文件 … 读写文件(若干次) … 关闭文件 这个处理顺序表明:一个文件被存取之前首先要打开它,只有文件被打开后才能进行 读/写操作,文件读/写完毕后必须关闭。 文件类指针与文件的打开、关闭 6 . 3 文件类指针与文件的打开、关闭 一、文件的打开 在操作系统中,每一个文件都有一个名字以供识别,如存储在磁盘上的 C 源程序文件 file1.c,file2.c 等。文件名是文件的外部名,通过它可以找到文件的实际存储设备、位置、大 小、特性等诸如此类的相关信息。这些信息只能由操作系统的文件管理系统掌握与管理,因此要存取 文件必须通过操作系统的文件系统。这意味着一个 C 语言程序没有直接通过文件的外部名存取一个外 部文件的能力,程序中要存取文件必须与文件系统取得联系,把要存取文件的有关信息和要求,诸如 文件的名字、读文件还是写文件、以何种方式读/写等告诉文件系统,由文件系统在设备中建立、寻 找、定位文件,分配存取文件的缓冲区,做好存取文件要求的一切准备工作。 上述存取文件的有关信息和要求都由程序通过 I/O 库函数 fopen 告诉操作系统。 fopen 函数的一般调用形式是:
fp= fopen(文件名,存取方式) 其中fp为缓冲区指针。缓冲文件系统,关键的概念是“文件指针”。每个被使用的 文件都在内存中开辟一个区,用来存放文件的有关信息(名、状态、当前位置等)。这些信息是保存 在一个结构体类型的变量中的。该结构体类型由系统定义,取名为FILE。有了FILE类型之后,可以用 来定义若干个FILE类型的变量,以便存放若干个文件的信息。 dn: FILE efile[-maxfilel, *fp 定义了一个结构体数组与一个指向FILE类型结构体的指针变量。可以使fp指向某 文件的结构体变量,从而通过该结构体变量中的文件信息访问该文件。也就是说,通过文件指针变 量能够找到与它相关的文件。如果有n个文件,一般应设n个指针变量(指向FLE类型结构体的指针 变量),使它们分别指向n个文件(确切地说,指向该文件的信息结构体),以实现对文件的访问。 “文件名”为要存取文件的外部名,它可以是字符串、字符数组名或指向文件名的 指针。“存取方式”以字符串的形式给出,用来指出如何存取文件。C语言允许的文件存取方式、含 及使用说明见书中表(P312)。 如:fp= fopen(“A1”,“r”) 它表示:要打开名字为A1的文件,使用文件方式“读入”, fopen函数带回指向A1 文件的指针并赋给fp,这样fp就和A1相联系了,或者说,fp指向A1文件。可以看出,在打开一个 文件时,通知给编译系统以下三个信息 ①需要打开的文件名,也就是准备访问的文件的名字 ②使用文件的方式(读还是写等) ③让哪一个指针变量指向被打开的文件。 、文件的关闭 在使用完一个文件后应该关闭它,以防止它再被误用。“关闭”就是使文件指针变量 不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对其相连的文件进行读 写操作,除非再次打开,使该指针变量重新指向该文件。用 fclose函数关闭文件 fclose函数调用的一般形式为: fclose(文件指针)
FILE *fp; fp=fopen(文件名,存取方式); 其中 fp 为缓冲区指针。缓冲文件系统,关键的概念是“文件指针”。每个被使用的 文件都在内存中开辟一个区,用来存放文件的有关信息(名、状态、当前位置等)。这些信息是保存 在一个结构体类型的变量中的。该结构体类型由系统定义,取名为 FILE。有了 FILE 类型之后,可以用 它来定义若干个 FILE 类型的变量,以便存放若干个文件的信息。 如:FILE _efile[-maxfile], *fp; 定义了一个结构体数组与一个指向 FILE 类型结构体的指针变量。可以使 fp 指向某一 个文件的结构体变量,从而通过该结构体变量中的文件信息访问该文件。也就是说,通过文件指针变 量能够找到与它相关的文件。如果有 n 个文件,一般应设 n 个指针变量(指向 FILE 类型结构体的指针 变量),使它们分别指向 n 个文件(确切地说,指向该文件的信息结构体),以实现对文件的访问。 “文件名”为要存取文件的外部名,它可以是字符串、字符数组名或指向文件名的一 个指针。“存取方式”以字符串的形式给出,用来指出如何存取文件。C 语言允许的文件存取方式、含 义及使用说明见书中表(P312)。 如:fp=fopen(“A1”,“r”); 它表示:要打开名字为 A1 的文件,使用文件方式“读入”,foprn 函数带回指向 A1 文件的指针并赋给 fp,这样 fp 就和 A1 相联系了,或者说,fp 指向 A1 文件。可以看出,在打开一个 文件时,通知给编译系统以下三个信息: ①需要打开的文件名,也就是准备访问的文件的名字。 ②使用文件的方式(读还是写等)。 ③让哪一个指针变量指向被打开的文件。 二、文件的关闭 在使用完一个文件后应该关闭它,以防止它再被误用。“关闭”就是使文件指针变量 不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对其相连的文件进行读 写操作,除非再次打开,使该指针变量重新指向该文件。用 fclose 函数关闭文件。 fclose 函数调用的一般形式为: fclose (文件指针);
用 fopen函数打开文件时所带回的指针赋给了fp,如今把该文件关闭 应该养成在程序终止之前关闭所有使用的文件的习惯,如果不关闭文件将会丢失数 据。因为,如前所述,在向文件写数据时,是先将数据输到缓冲区、待缓冲区充满后才正式输出给文 如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。用 fclose函数关闭文 ,可以避免这个总是,它先把缓冲区中的数据输出到磁盘文件然后才释放文件指针变量 fclose函数也带回一个值:当顺利地执行了关闭操作,则返回值为0:如果返回值 非零值,则表示关闭时有错误。 文件的读写与定位 4文件的读写与定位 文件的读写 读/写字符函数( fputc函数和 fgetc函数)或(putc函数和getc函数) fputc函数—把一个字符写到磁盘文件上去。 一般形式为 fputc (ch, fp) 其中ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量。fp是文 指针变量,它从 fopen函数得到返回值。上面 fputc(ch,fp)函数的作用是将字符(cn的值)输 出到fp所指向的文件上去。 fputc函数也带回一个值:如果输出成功则返回值就是输出的字符:如果输出失败 刂返回一个EOF。EOF是在 stdio.h文件中定义的符号常量,值为-1 我们在第三章介绍过 putchar函数,其实 putchar是从 fputc函数派生出来的 putchar(c)是用 define定义的宏 #define putchar (c) fputc(c, stdout) #define getchar fgetc (stdin)
用 fopen 函数打开文件时所带回的指针赋给了 fp,如今把该文件关闭。 应该养成在程序终止之前关闭所有使用的文件的习惯,如果不关闭文件将会丢失数 据。因为,如前所述,在向文件写数据时,是先将数据输到缓冲区、待缓冲区充满后才正式输出给文 件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。用 fclose 函数关闭文 件,可以避免这个总是,它先把缓冲区中的数据输出到磁盘文件然后才释放文件指针变量。 fclose 函数也带回一个值:当顺利地执行了关闭操作,则返回值为 0;如果返回值 为非零值,则表示关闭时有错误。 文件的读写与定位 6 . 4 文件的读写与定位 一、文件的读写 1. 读/写字符函数(fputc 函数和 fgetc 函数)或(putc 函数和 getc 函数) fputc 函数──把一个字符写到磁盘文件上去。 一般形式为: fputc(ch,fp); 其中 ch 是要输出的字符,它可以是一个字符常量,也可以是一个字符变量。fp 是文 件指针变量,它从 fopen 函数得到返回值。上面 fputc(ch,fp)函数的作用是将字符(cn 的值)输 出到 fp 所指向的文件上去。 fputc 函数也带回一个值:如果输出成功则返回值就是输出的字符;如果输出失败, 则返回一个 EOF。E0F 是在 stdio.h 文件中定义的符号常量,值为一 1。 我们在第三章介绍过 putchar 函数,其实 putchar 是从 fputc 函数派生出来的。 putchar(c)是用 define 定义的宏: #define putchar(c) fputc(c,stdout) #define getchar() fgetc(stdin)
前面已叙述, stdout、 stdin均是系统定义的文件指针变量,它们与终端输出相连 putc(c, stdout)的作用是将c的值输出到终端。用宏 putchar(e)比写 fputc(e, stdout)简单 些。从用户的角度,可以把 putchar(c)看作函数而不必严格地称它为宏 fgetc函数——从指定文件读入一个字符。该文件必须是以读或读写方式打开的。调 用形式为:ch= fgetc(fp): 其中,fp为文件型指针变量,ch为字符变量。 fgetc函数带回一个字符,赋给ch 如果基执行 fgetc读字符时遇到文件结束符,函数返回一个文件结束标志EOF,EOF在 stdio. h中定义 1。如果想从一个磁盘文件顺序读入字符并在屏幕上显示出来,可以: ch=fgetc(fp) hile(ch!=EOF) Tchar(ch) ch=fgetc(fp) exit o函数的功能是:终止程序执行,关闭文件并返回DOs,它定义在 stdio.h中 注意:EOF不是可输出字符,因此不能在屏幕上显示。由于字符的 ASCII码不可能出 1,因此EF定义为-1是合适的。当读入的字符值等于-1(即EOF)时,表示读入的已不是正常的 符而是文件结束符。但以上只适用于读文本文件的情况。现在 ANSI C已允许用缓冲文件系统处理二 制文件,而读入某一个字节中的二进制数据的值有可能是-1,而这又恰好是EOF 就出现了 需要读入有用数据而却被处理为“文件结束”的情况。为了解这个总是, ANSI C 个feof函数来 断文件是否真的结束 feof(fp)用来测试fp所指向的文件当前状态是否“文件结束”。如果是文件结 束,函数feof(fp)的值为1,否则为0。如果想顺序读入一个二进制文件中的数据,可以用 while(!feof(fp)) f c=fgetc(fp) 当遇文件结束,feof(fp)的值为0,!feof(fp)的值为1,读入一个字节的数据赋 给整型变量c(当然可以接着对这些数据进行所需的处理)。直到遇到文件结束,feof(fp)值为1,不 执行 while循环 这种方法也适用于文本文件 、文件的定位
前面已叙述,stdout、stdin 均是系统定义的文件指针变量,它们与终端输出相连。 fputc(c,stdout)的作用是将 c 的值输出到终端。用宏 putchar(c)比写 fputc(c,stdout)简单 一些。从用户的角度,可以把 putchar(c)看作函数而不必严格地称它为宏。 fgetc 函数──从指定文件读入一个字符。该文件必须是以读或读写方式打开的。调 用形式为:ch=fgetc(fp); 其中,fp 为文件型指针变量,ch 为字符变量。fgetc 函数带回一个字符,赋给 ch。 如果基执行 fgetc 读字符时遇到文件结束符,函数返回一个文件结束标志 EOF,EOF 在 stdio.h 中定义 为-1。如果想从一个磁盘文件顺序读入字符并在屏幕上显示出来,可以: ch=fgetc(fp); while (ch!=EOF) { putchar(ch); ch=fgetc(fp); } exit()函数的功能是:终止程序执行,关闭文件并返回 DOS,它定义在 stdio.h 中。 注意:EOF 不是可输出字符,因此不能在屏幕上显示。由于字符的 ASCII 码不可能出 现-1,因此 EOF 定义为-1 是合适的。当读入的字符值等于-1(即 EOF)时,表示读入的已不是正常的 字符而是文件结束符。但以上只适用于读文本文件的情况。现在 ANSI C 已允许用缓冲文件系统处理二 进制文件,而读入某一个字节中的二进制数据的值有可能是-1,而这又恰好是 EOF 的值。这就出现了 需要读入有用数据而却被处理为“文件结束”的情况。为了解这个总是,ANSI C 提供一个 feof 函数来 判断文件是否真的结束。 feof(fp)用来测试 fp 所指向的文件当前状态是否“文件结束”。如果是文件结 束,函数 feof(fp)的值为 1,否则为 0。如果想顺序读入一个二进制文件中的数据,可以用: while (!feof(fp)) { c=fgetc(fp); …… } 当遇文件结束,feof(fp)的值为 0,!feof(fp)的值为 1,读入一个字节的数据赋 给整型变量 c(当然可以接着对这些数据进行所需的处理)。直到遇到文件结束,feof(fp)值为 1,不 再执行 while 循环。 这种方法也适用于文本文件。 二、文件的定位
rewind函数 语法: rewind(fp); 语义:使位置指针重新返回文件的开头。 例如:有一个磁盘文件,第一次将它的内容显示在屏幕上,第二次把它复制到另一文 include <stdio. h main FILE *fpl, *fp2 fpl= fopen(“file1.c”,“r”) fp2= fopen(“file2.c”,“w”) while! feof(fp1))put char (getc(fp1)) rewind (fp1) while(! feof (p1))putc(getc(fp1), fp2 fclose(fp1): fclose(fp2) 2. fseek函数 语法: fseek(fp,位移量w,起始点) 语义:使位置指针移到距起始点偏移w个字节处。其中,起始点可为0、1、2,分别 表示文件开始、当前位置、文件末尾 fseek(fp, 100L, 0) fseek(fp, 50L, 1) fseek(fp, -10L, 2)
1. rewind 函数 语法:rewind(fp); 语义:使位置指针重新返回文件的开头。 例如:有一个磁盘文件,第一次将它的内容显示在屏幕上,第二次把它复制到另一文 件上。 #include main( ) { FILE *fp1, *fp2; fp1=fopen( “file1.c”, “r”); fp2=fopen(“file2.c”, “w”); while(!feof(fp1))putchar(getc(fp1)); rewind(fp1); while(!feof(p1))putc(getc(fp1),fp2); fclose(fp1); fclose(fp2); } 2. fseek 函数 语法:fseek(fp,位移量 w,起始点); 语义:使位置指针移到距起始点偏移 w 个字节处。其中,起始点可为 0、1、2,分别 表示文件开始、当前位置、文件末尾。 例如: fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,2);
说明: fseek函数一般用于二进制文件 例如:在磁盘文件上存有10个学生的数据。要求将第1、3、5、7、9个学生的数据 输入计算机,并在屏幕上显示出来 #include truct student type char name [10] Int num int age char sex stud[10] main() 1nt 1 FILE *fp if((fp= fopen(“stud.dat”,"rb”)==NULL) printf(“ cannot open file\n”) exit(0): for(i=0;i<10;i+=2) I fseek(fp, i*sizeof (struct student_ type), O) fread(&stud], sizeof(struct student type), 1, fp) printf ("%s %d %d %c\n", stud[i] name, stud[i]. num, stud[i]. age, stud[] fclose(fp) ftell函数
说明:fseek 函数一般用于二进制文件。 例如:在磁盘文件上存有 10 个学生的数据。要求将第 1、3、5、7、9 个学生的数据 输入计算机,并在屏幕上显示出来。 #include struct student_type { char name[10]; int num; int age; char sex; } stud[10]; main( ) { int i; FILE *fp; if((fp=fopen(“stud.dat”,”rb”)= =NULL) { printf(“cannot open file\n”); exit(0);} for(i=0;i<10; i+=2) { fseek(fp, i*sizeof(struct student_type),0); fread(&stud[i],sizeof(struct student_type),1,fp); printf(“%s %d %d %c\n”,stud[i].name, stud[i].num, stud[i].age, stud[i], sex); } fclose(fp); } 3. ftell 函数
语法: ftell(fp) 语义:得到流式文件中的当前位置。用相对于文件开头的位移量来表示。如果 ftell 函数的返回值为-1L,则表示出错。 i=ftell(fp) if(i==-1L) printf(“ error \n”) #include oid main(void) FILE *fp; long position fp= fopen(“gg.txt”,“a”); position=ftell(fp) printf(“ position=%ldn”, poSition) fprintf(fp,“data\n”) position=ftell (fp) printf(“ poSition=%ldⅦn”, position)
语法:ftell(fp); 语义:得到流式文件中的当前位置。用相对于文件开头的位移量来表示。如果 ftell 函数的返回值为-1L,则表示出错。 例如: i=ftell(fp); if(i= =-1L) printf(“error\n”); #include void main(void) { FILE *fp; long position; fp=fopen (“gg.txt”, “a”); position=ftell(fp); printf(“position=%ld\n”, position); fprintf(fp, “data\n”); position=ftell(fp); printf(“position=%ld\n”, position); fclose(fp); }