-
static和extern修饰局部变量
static和extern都是用来修饰变量的(局部static实际也是全局的)
static修饰的变量 只有你的包含那个变量定义的源代码文件可以访问(内部的变量)
extern定义的变量的哪个源文件都可以访问 只要生命了就可以(外部变量)
static(静态变量) 和 extern 修饰局部变量
static修饰局部变量:
//作用:1)static定义的变量的作用域会得到延长
// 2) static定义变量的语句只会被执行一次
extern是不能够修饰局部变量的
#include <stdio.h>
/**
*
*/
void sum(){
//没有使用static修饰
int num = 0;
printf("num =%d\n",num); //0
num++;
}
void sum1(){
//static 可以修饰局部变量
//作用:1)static定义的变量的作用域会得到延长
// 2) static定义变量的语句只会被执行一次
static int num = 0;
printf("num =%d\n",num); //0
num++;
}
void sum2(){
//extern int num = 0;
int num = 0;
printf("num =%d\n",num); //0
num++;
}
int main(int argc, const char * argv[]) {
// sum1();
// sum1();
// sum1();
return 0;
}
-
static和extern修饰全局变量
全局变量:
内部变量:只能在本文件中访问的变量
外部变量:可以在其他访问的变量,默认所有全局变量都是外部变量
Static作用:
声明一个内部变量
定义一个内部变量
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。
注意:
在不同文件中可以定义同名的内部变量,互不影响。
static 对全局变量的作用(内部变量)
static修饰的全局变量,表示该全局变量只能在当前文件中使用,而不能在其他文件中使用
在不同的文件中,使用static可以声明的同名的变量
extern 对全局变量的作用
extern修饰的全局变量,表示当前变量可以在本文件中使用,也可以在
其他文件中使用
注意:
1)extern声明的全局变量在不同的文件中不能同名(两个文件须由包含关系)
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
static int num = 10; //声明同名变量
//externint a=10; //因为test.c文件中已经定义a了
//全局声明
//2)externint a;
//
int a; //省略了extern
//不能声明不存在的变量
extern int b;
int x; //全局变量默认的初始化为0
int main() {
printf("num =%d\n",num);
//调用test.c中的函数
test1();
//1)在使用a之前 extern int a; //声明变量a
printf("-->a = %d\n",a);
printf("x = %d\n",x);
test2();
return 0;
}
-
文件:指存储在外部介质上数据的集合,这个数据集合有一个名称,叫做文件名。
-
文件分类:
-
从用户的角度看,文件可分为普通文件和设备文件两种
-
从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种
-
文件的操作步骤:
-
引入头文件(stdio.h)
-
定义文件指针
-
打开文件
-
文件读写
-
关闭文件
-
对文件的读和写最常用的文件操作,在c语言中提供了多种文件读写的函数
-
字符读写函数:fgetc和fputc
-
字符串读写函数:fgets和fputs
-
数据块读写函数:fread和fwrite
-
格式化读写函数:fscanf和fprintf
-
C语言文件指针:在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。
一般形式:
FILE *指针变量标识符;
例如:FILE *fp
-
文件的打开(fopen函数)
一般形式:
文件指针名=fopen(文件名,使用文件方式);
其中:
“文件指针名“必须是被说明为FILE类型的指针变量
”文件名“是被打开文件的文件名
”使用文件方式“是指文件的类型和操作要求
”文件名“是字符串常量或字符串数组
例如:
FILE *fp=NULL;
Fp=fopen(”a.txt“,”r“);
-
文件关闭函数(fclose函数)
文件一但使用完毕,应用关闭文件函数把文件关闭,以避免文件的数据丢失等错误
一般格式:
Fclose(文件指针);
例如
Fclose(fp);
正常完成关闭文件操作时,fclose函数返回值为0,如返回非零值则表示有错误发生。
注意:如果文件写操作时,没有进行关闭,可能会导致文件写入失败
操作文件的步骤:
1)引入头文件stdio.h
2) 建立文件指针
FILE *fp = NULL;
3) 打开文件
fopen(文件件名,操作方式);
如果打开成功,返回文件的首地址
失败,返回NULL
4) 操作文件
5)关闭文件
fclose(文件指针);
#include <stdio.h>
int main(int argc, const char * argv[]) {
//定义文件指针
FILE *fp = NULL; //FILE结构体类型的指针
//打开文件
fp = fopen("a.txt", "r"); //r是操作方式
//它去哪里找这个a.txt 文件
// /Users/apple/Library/Developer/Xcode/DerivedData/C14-文件操作-fcgemvdljntpmthddfnbkmwvqxdw/Build/Products/Debug/
//fopen成功,返回的事文件的首地址
//fopen失败 返回NULL
//一般我们做一个判断,当文件打开成功,我们再读写文件
if (fp!=NULL) {
//操作文件
printf("文件打开成功!");
}else{
//给用户一个提示
printf("文件打开失败,按任意键退出!\n");
//按任意键退出
getchar(); //要求从键盘接收一个字符
//退出
exit(1); //非正常退出
}
fclose(fp); //
return 0;
}
-
文件的使用方式:
-
文件使用方式注意事项:
-
文件使用方式由r w a t b +六个字符拼成
r 读
w 写
a 追加
t 文本文件,可省略不写
b 二进制文件
+ 读和写
-
凡用r打开一个文件时,该文件必须已经存在,且只能从该文件读出
-
用w打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则该文件删去,重建一个新文件
-
若要向一个已存在的文件追加新的信息,只能用”a“方式打开文件。如果文件不存在,也会自动帮我们创建
-
在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。
-
把一个文本文件读入内存时,要将ASCII码转换成二进制码,而把温江以文本方式写入磁盘时,也要把二进制码转换成ASCII,因此文本文件的读写要花费较多的转换时间,对二进制文件的读写不存在这种转换
-
标准输入文件(键盘),标准输出文件(显示器),标准出错输出(出错信息)是由系统打开的,可直接使用。
-
字符写入函数fputc
字符读写函数是以字符(字节)为单位的读写函数,每次可从文件读出或向文件写入一个字符。
Fputc函数的功能是把一个字符写入指定的文件中,函数调用的形式为:
Fputc(字符量,文件指针);
其中,特写如的字符量可以是字符常量或变量,例如:
Fputc(’a‘,fp);
其意义是把字符a写入fp所指向的文件中。
18.字符串读写函数:
写入:fputs
Fputs(字符串,文件指针);
#include <stdio.h>
void test(){
//写入字符串到文件中
char str[]="welcome to afuhan";
//定义文件指针
//打开文件
FILE *fp = fopen("fputs.txt", "w");
//判断
int count=0;
if (fp!=NULL) {
//写字符串到文件中
//count 返回的事本次写入的字符串的长度
count = fputs(str, fp);
printf("写入成功,本次写入%d个字符\n",count);
}
//关闭文件指针
fclose(fp);
}
/**
* 字符串的追加
*/
void test1(){
//写入字符串到文件中
char str[]="welcome to afuhan";
//定义文件指针
//打开文件,追加是在文件的末尾追加
FILE *fp = fopen("fputs.txt", "a"); //a append
//判断
int count=0;
if (fp!=NULL) {
//写字符串到文件中
//count 返回的事本次写入的字符串的长度
count = fputs(str, fp);
printf("写入成功,本次写入%d个字符\n",count);
}
//关闭文件指针
fclose(fp);
}
int main(int argc, const char * argv[]) {
//写入字符串到文件中
char str[]="welcome to afuhan\n";
//定义文件指针
//打开文件
FILE *fp = fopen("fputs.txt", "r"); //r read
//判断
char str2[100];
if (fp!=NULL) {
//fgets(ch,10,stdin);
//从文件中读取字符到字符数组str2中
// 数组名 长度 文件指针
fgets(str2, sizeof(str2), fp);
//fputs(str, fp);
//sizeof(str2) 100
//注意:
//1)fgets读取的时候,当文件内容读取完毕后,会给字符加上结束符\0
//2)fgets读取的时候,遇到\n或者EOF,读取结束
printf("str2---->%s\n",str2);
}
//关闭文件指针
fclose(fp);
return 0;
}
19.读取数据块的函数fread和fwrite
读数据块函数调用的一般形式:
Fread(buffer,size,count,fp);
写数据块函数调用的一般形式:
Fwrite(buffer,size,count,fp);
#include <stdio.h>
#include <string.h>
void test(){
//fwrite 写一个数据块
//先写一个字符串
//定义文件指针,并且打开文件
FILE *fp = fopen("fwrite.txt", "w");
if (fp!=NULL) {
//写文件
char *str ="helloworld!";
//用fwrite写数据
//fwrite(地址,块大小,块数,文件指针);
fwrite(str, strlen(str), 1, fp);
printf("写入成功!\n");
}
fclose(fp);
}
/**
* fread读取字符串
*/
void test1(){
//视频
//定义文件指针,并且打开文件
FILE *fp = fopen("fwrite.txt", "r");
if (fp!=NULL) {
//写文件
char *str ="helloworld!";
//用fread读取数据
//fread(地址,块大小,块数,文件指针);
char ch[12];
fread(ch, sizeof(ch), 1, fp);
printf("%s\n",ch);
}
fclose(fp);
}
int main(int argc, const char * argv[]) {
//视频
//定义文件指针,并且打开文件
FILE *fp = fopen("fw.data", "wb");
if (fp!=NULL) {
int a = 123;
fwrite(&a, sizeof(int), 1, fp);
printf("写入成功!");
}
fclose(fp);
return 0;
}
20.格式化读写函数fscanf和fprintf:
两者都是格式化读写函数。两者区别在于fscanf函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。
格式:
Fscanf(文件指针,格式字符串,输入表列);
Fprintf(文件指针,格式字符串,输出表列);
例如:
Fscanf(fp,“%d%s“,&i,s);
Fprintf(fp,“%d%c“,j,ch);
21.文件的随机读写实现:
移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。
实现随机读写的关键是按要求移动位置指针,这称为文件的定位。
Rewind和fseek函数
Rewind(文件指针);功能是把文件内部的位置指针移到文件首。
22.文件检测函数feof函数
作用:判断文件是否处于文件结束位置。(每次都多执行一次,不推荐)
调用格式:
Feof(文件指针);
Clearerr函数调用格式:
Clearerr(文件指针);
功能:本函数用于清除出错标志和文件结束标志,使他们为0值