用c语言实现24LC256读写
用c语言实现24LC256读写
用c语言实现24LC256读写(非软件模拟方式)
24LC256工作电压为2.5V~5.5V,容量为32K×8bit,为两线串行接口总线,标准与I2C TM兼容。SCL为24LC256的时钟输入管脚,SDA为其串行地址/数据输入/数据输出管脚。24LC256提供读顺序地址内容的操作方式,其内部的地址指针在每次读操作完成之后加1,此地址指针允许在一次读操作期间,连续顺序地读出整个存储器的内容。
#include
unsigned char i=0;
unsigned char receive=0x00;
void i2c_start()
{
SEN=1; //启动
do{
}while(SSPIF==0);
SSPIF=0;
}
void i2c_stop()
{
PEN=1; //产生停止条件
do{
;
}while(SSPIF==0);
SSPIF=0;
}
void i2c_restart()
{
RSEN=1; //启动,反复启动
do{
;
}while(SSPIF==0);
SSPIF=0;
}
void i2c_dataout() //数据发送等待过程
{
do{
;
}while(SSPIF==0);
SSPIF=0;
}
void i2c_datain() //读取24LC256时,不是读的最后一个字节时使用
{
RCEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
receive=SSPBUF;
ACKDT=0;
ACKEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
}
void i2c_datainlast() //读取最后一个字节,或只读取24lc256中一个字节{
SSPIF=0;
RCEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
receive=SSPBUF;
ACKDT=1 ;
ACKEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
}
void i2c_error()
{
i2c_stop();
return;
}
void write(unsigned int addr,unsigned char data,unsigned int n) //向iic写入一字节数据地址,数据,字节个数
{
i2c_start();
SSPBUF=0xA0;//EEPROM寻址码和写操作命令码
i2c_dataout(); //发送
if(ACKSTAT)
i2c_error(); //无应答,错误!
else if(!ACKSTAT)
SSPBUF=addr/256;
//高eeaddr/256 ,取eeprom数据地址高字节
i2c_dataout(); //发送
if(ACKSTAT)
i2c_error(); //无应答,错误!
else if(!ACKSTAT)
SSPBUF=addr%256;//低eeaddr%256 ,取eeprom数据地址低字节
i2c_dataout(); //发送
for(i=0;i { if(ACKSTAT)//应答 i2c_error(); //无应答,错误! else if(!ACKSTAT) SSPBUF=data;//eedata 入eeprom的数据 i2c_dataout();//发送 } if(ACKSTAT)//应答 i2c_error(); i2c_stop(); //产生停止位,启动eeprom内部些过程 do{ i2c_start(); SSPBUF=0xA0; i2c_dataout(); i2c_stop(); if(!ACKSTAT)break; }while(ACKSTAT); } unsigned int current_read(void)//current address read ok! { i2c_start(); SSPBUF=0xA1;//寻址命令码0xA0 和读命令 i2c_dataout(); if(ACKSTAT)//应答 i2c_error(); else if(!ACKSTAT) i2c_datainlast(); i2c_stop(); return ((unsigned int)receive); } unsigned int random_read(unsigned int eepromaddress) { i2c_start(); SSPBUF=0xA0;//EEPROM寻址码和写操作命令码 i2c_dataout(); //发送 if(ACKSTAT) i2c_error(); //无应答,错误! else if(!ACKSTAT) SSPBUF=eepromaddress/256; //高eeaddr/256 ,取eeprom数据地址高字节 i2c_dataout(); //发送 if(ACKSTAT) i2c_error(); //无应答,错误! else if(!ACKSTAT) SSPBUF=eepromaddress%256;//低eeaddr%256 ,取eeprom数据地址低字节 i2c_dataout(); //发送 if(ACKSTAT) i2c_error(); //无应答,错误! else if(!ACKSTAT) i2c_restart(); SSPBUF=0xA1;//寻址命令码0xA0 和读命令 i2c_dataout(); if(ACKSTAT)//应答 i2c_error(); else if(!ACKSTAT) i2c_datainlast(); i2c_stop(); return ((unsigned int)receive); } void i2c_init() { SSPSTAT=0x00; TRISC=0xD8; SSPADD=19; SSPIE=0; SSPCON=0x28; } 实例1 /* 51系列单片机在使用时,有时需要模拟I2C总线_nbsp; */ /* 这里举出一个实例(读写串行EEPROM芯片at24C02_nbsp; */ /******************************************************************** ****/ /* Name:AT24C02存储器的读写程序,用到I2C总线,含相对独立的I2C总线读写函数 */ /* Language: C51单片机编程语 言 */ /* Platform: Win98,Intel Celeron 433 Processor,伟福仿真器,仿真875 1 */ /* Author: StephenZhu javasdk@163.co m */ /* Date: 2003广朿1旿5朿2旿5朿9旿nbsp; */ /* Version: 1.1.1 */ /* Others: Non e */ /******************************************************************** ****/ #i nclude #i nclude #i nclude #define DELAY_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱* / #define TRUE 1 #define FALSE 0 sbit SCL=P1^7;/*假设由P1.7和P1.6控制*/ sbit SDA=P1^6; /********** Definition 函数定义 ************/ void DELAY(unsigned int t) /*延时函数*/ { while(t!=0) t--; } void I2C_Start(void) { /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/ SDA=1; SCL=1; DELAY(DELAY_TIME); SDA=0; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } void I2C_Stop(void) /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/ SDA=0; SCL=1; DELAY(DELAY_TIME); SDA=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } void SEND_0(void) /* SEND ACK */ { /*发逿,在SCL为高电平时使SDA信号为低*/ SDA=0; SCL=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } void SEND_1(void) { /*发逿,在SCL为高电平时使SDA信号为高*/ SDA=1; SCL=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } bit Check_Acknowledge(void) { /*发送完一个字节后检验设备的应答信号*/ SDA=1; SCL=1; DELAY(DELAY_TIME/2); F0=SDA; DELAY(DELAY_TIME/2); SCL=0; DELAY(DELAY_TIME); if(F0==1) return FALSE; return TRUE; void WriteI2CByte(char b)reentrant { /*向I2C总线写一个字芿/ char i; for(i=0;i <8;i++) if((b < SEND_1(); else SEND_0(); } char ReadI2CByte(void)reentrant { /*从I2C总线读一个字芿/ char b=0,i; for(i=0;i <8;i++) { SDA=1; /*释放总线*/ SCL=1; /*接受数据*/ DELAY(10); F0=SDA; DELAY(10); SCL=0; if(F0==1) { b=b < <1; b=b|0x01; } else b=b < <1; } return b; } /**********以下为读冿4c02的函敿*********/ void Write_One_Byte(char addr,char thedata) { bit acktemp=1; /*write a byte to mem*/ WriteI2CByte(0xa0); acktemp=Check_Acknowledge(); WriteI2CByte(addr);/*address*/ acktemp=Check_Acknowledge(); WriteI2CByte(thedata);/*thedata*/ acktemp=Check_Acknowledge(); I2C_Stop(); } void Write_A_Page(char *buffer,char addr) { bit acktemp=1; bit wrtmp; int i; /*write a page to at24c02*/ I2C_Start(); WriteI2CByte(0xa0); acktemp=Check_Acknowledge(); WriteI2CByte(addr);/*address*/ acktemp=Check_Acknowledge(); for(i=0;i <7;i++) { WriteI2CByte(buffer[i]); if(!Check_Acknowledge()) { I2C_Stop(); } } I2C_Stop(); } char Read_One_Byte(char addr) { bit acktemp=1; char mydata; /*read a byte from mem*/ WriteI2CByte(0xa0); acktemp=Check_Acknowledge(); WriteI2CByte(addr);/*address*/ acktemp=Check_Acknowledge(); I2C_Start(); WriteI2CByte(0xa1); acktemp=Check_Acknowledge(); mydata=ReadI2CByte(); acktemp=Check_Acknowledge(); return mydata; I2C_Stop(); } void Read_N_Bytes(char *buffer,char n,char addr) { bit acktemp=1; int i=0; /*read 8 bytes from mem*/ I2C_Start(); WriteI2CByte(0xa0); acktemp=Check_Acknowledge(); WriteI2CByte(addr);/*address*/ acktemp=Check_Acknowledge(); I2C_Start(); WriteI2CByte(0xa1); acktemp=Check_Acknowledge(); for(i=0;i { buffer[i]=ReadI2CByte(); if(i!=n-1) SEND_0(); /*发送应筿/ else SEND_1(); /*发送非应答*/ } I2C_Stop(); } void main() { int i; char mybyte; char myarray[8]; char myarray2[8]; char rdarray[16]; for(i=0;i <8;i++) { myarray[i]=i; myarray2[i]=i+0x08; } Write_One_Byte(0x20,0x28); Write_A_Page(myarray,0x10); Write_A_Page(myarray2,0x18); mybyte=Read_One_Byte(0x20); Read_N_Bytes(rdarray,16,0x10); } ============================================================================================ ====== 实例2 /********************************** I2C总线驱动 ************************************* 模块名:I2C总线驱动型号:I2C 创建人:陈曦日期_005-6-15 修改人:陈曦日期_005-6-19 功能描述_/p> 此模块包括发送数据及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,能很 方便的与用户程序进行连接并扩展?br> 需要注意的是,函数是采用延时方法产甿SCL 脉冲,对高晶振频率要做一定的修改!! 在写E2PROM的时候一定要延时!!_br> 说明_/p> 1us机器周期,晶振频率要小于12MHz 返回 1 则操作成功,返回 0 则操作失败?br> sla 为器件从地址,suba 为器件子地址?/p> *************************************************************************************/ #i nclude "AT89X52.h" #i nclude #define _Nop() _nop_() //定义空指仿/p> sbit SDA = P1^3; //模拟I2C数据传输使br>sbit SCL = P1^2; //模拟I2C时钟控制使/p> bit bdata I2C_Ack; //应答标志使/p> /************************************ I2C_Start ************************************ 函数名:void I2C_Start() 入口_br> 出口_/p> 功能描述:启动I2C总线,即发送I2C初始条件 调用函数_nbsp; 全局变量_/p> 创建者:陈曦日期_005-6-15 修改者:日期_/p> **********************************************************************************/ void I2C_Start() { SDA = 1; //发送起始条件的数据信号 _Nop(); SCL = 1; _Nop(); //起始条件建立时间大于4.7us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SDA = 0; //发送起始信叿br> _Nop(); //起始条件建立时间大于4us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SCL = 0; //钳住I2C总线准备发送或接收数据 _Nop(); _Nop(); } /************************************ I2C_Stop ************************************ 函数名:void I2C_Stop() 入口_br> 出口_/p> 功能描述:结束I2C总线,即发送I2C结束条件 调用函数_nbsp; 全局变量_/p> 创建者:陈曦日期_005-6-15 修改者:日期_/p> **********************************************************************************/ void I2C_Stop() { SDA = 0; //发送结束条件的数据信号 _Nop(); SCL = 1; //发送结束条件的时钟信号 _Nop(); //结束条件建立时间大于4us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SDA = 1; //发送I2C总线结束信号 _Nop(); _Nop(); _Nop(); _Nop(); } /************************************ I2C_CheckAck ************************************ 函数名:bit I2C_CheckAck(void) 入口_br> 出口_(无应答),1(有应答_/p> 功能描述_br> 检验I2C总线应答信号,有应答则返囿,否则返囿,超时值取255 调用函数:void I2C_Stop() 全局变量_/p> 创建者:陈曦日期_005-6-15 修改者:日期_/p> **********************************************************************************/ bit I2C_CheckAck(void) { uchar errtime = 255; // 因故障接收方旿Ack,超时值为255 SDA = 1; _Nop(); _Nop(); _Nop(); SCL = 1; _Nop(); //时钟电平周期大于 4 us _Nop(); _Nop(); _Nop(); _Nop(); while(SDA) { errtime--; if(errtime==0) { I2C_Stop(); return(0); } } SCL = 0; _Nop(); return(1); } /************************************ I2C_SendB ************************************ 函数名:void I2C_SendB(uchar c) 入口:uchar 型数捿br> 出口_/p> 功能描述_br> 字节数据传送函数,将数捿c 发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作 调用函数:bit I2C_CheckAck() 全局变量:I2C_Ack 创建者:陈曦日期_005-6-15 修改者:日期_/p> **********************************************************************************/ void I2C_SendB(uchar c) { uchar BitCnt; for (BitCnt=0; BitCnt<8; BitCnt++) //要传送的数据长度丿使br> { if((c< { SDA = 1; } else { SDA = 0; } _Nop(); _Nop(); SCL = 1; //置时钟线为高通知被控器开始接收数据位 _Nop(); //保证时钟高电平周期大亿4us _Nop(); _Nop(); _Nop(); _Nop(); SCL = 0; } _Nop(); _Nop(); I2C_Ack = I2C_CheckAck(); //检验应答信叿br> _Nop(); _Nop(); } /************************************ I2C_RcvB ************************************ 函数名:uchar I2C_RcvB() 入口_br> 出口:uchar型数捿/p> 功能描述_br> 接收从器件传来的数据,并判断总线错误(不发应答信号),收完后需要调用应答函数? /p> 调用函数_br> 全局变量_/p> 创建者:陈曦日期_005-6-15 修改者:日期_/p> **********************************************************************************/ uchar I2C_RcvB() { uchar retc; uchar BitCnt; //使/p> retc = 0; SDA = 1; //置数据总线为输入方弿br> for(BitCnt=0;BitCnt<8;BitCnt++) { _Nop(); SCL = 0; //置时钟线为低准备接收数据使br> _Nop(); //时钟低电平周期大亿.7us _Nop(); _Nop(); _Nop(); _Nop(); SCL = 1; //置时钟线为高使数据有敿br> _Nop(); _Nop(); retc = retc<<1; if(SDA==1) { retc = retc + 1; //读数据位,接收的数据放入retc丿br> } _Nop(); _Nop(); } SCL = 0; _Nop(); _Nop(); return(retc); } /************************************ I2C_Ackn ************************************ 函数名:void I2C_Ackn(bit a) 入口_房 出口_/p> 功能描述:主控制器进行应答信号(可以是应答或非应答信号) 调用函数_br> 全局变量_/p> 创建者:陈曦日期_005-6-15 修改者:日期_/p> **********************************************************************************/ void I2C_Ackn(bit a) { if(a==0) //在此发送应答或非应答信叿br> { SDA = 0; } else { SDA = 1; } _Nop(); _Nop(); _Nop(); SCL = 1; _Nop(); //时钟电平周期大于 4 us _Nop(); _Nop(); _Nop(); _Nop(); SCL = 0; //清时钟线钳住I2C总线以便继续接收 _Nop(); _Nop(); } /******************************** I2C_ISendB ************************************ 函数名:bit I2C_ISendB(uchar sla, uchar suba, uchar c) 入口:从器件地址 sla,子地址 suba, 发送字芿c 出口_(操作有误)_(操作成功) 功能描述:从启动总线到发送地址、数据,结束总线的全过程_br> 如果返回1,表示操作成功,否则操作有误?/p> 调用函数:I2C_Start(),I2C_SendB(uchar c),I2C_Stop() 全局变量:I2C_Ack 创建者:陈曦日期_005-6-15 修改者:日期_/p> **********************************************************************************/ bit I2C_ISendB(uchar sla, uchar suba, uchar c) { I2C_Start(); //启动总线 I2C_SendB(sla); //发送器件地址 if(!I2C_Ack) { return(0); } I2C_SendB(suba); //发送器件子地址 if(!I2C_Ack) { return(0); } I2C_SendB(c); //发送数捿br> if(!I2C_Ack) { return(0); } I2C_Stop(); //结束总线 return(1); } /********************************** I2C_IRcvB ************************************ 函数名:bit I2C_IRcvB(uchar sla, uchar suba, uchar *c) 入口:从器件地址 sla, 子地址 suba, 收到的数据在 c 出口_(操作成功)_(操作有误) 功能描述:从启动总线到发送地址、读数据,结束总线的全过程?/p> 调用函数_nbsp;I2CS_tart(), I2C_SendB(uchar c), I2C_RcvB(), I2C_Ackn(bit a), I2C_Stop() 全局变量:I2C_Ack 创建者:陈曦日期_005-5-15 修改者:日期_/p> **********************************************************************************/ bit I2C_IRcvB(uchar sla, uchar suba, uchar *c) { I2C_Start(); //启动总线 I2C_SendB(sla); if(!I2C_Ack) { return(0); } I2C_SendB(suba); //发送器件子地址 if(!I2C_Ack) { return(0); } I2C_Start(); //重复起始条件 I2C_SendB(sla+1); //发送读操作的地址 if(!I2C_Ack) { return(0); } *c = I2C_RcvB(); //读取数据 I2C_Ackn(1); //发送非应答使br> I2C_Stop(); //结束总线 return(1); } 文件操作函数C语言(FILE fputc fgetc fputs fgets fscanf fprintf) 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。 一、流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:typedef struct{ int level;/*fill/empty level of buffer*/ unsigned flags;/*File status flags*/ char fd;/*File descriptor*/ unsigned char hold;/*Ungetc char if no buffer*/ int bsize;/*Buffer size*/ unsigned char_FAR*buffer;/*Data transfer buffer*/ unsigned char_FAR*curp;/*Current active pointer*/ unsigned istemp;/*Temporary file indicator*/ short token;/*Used for validity checking*/ }FILE;/*This is the FILE object*/ FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表函数功能 fopen()打开流 fclose()关闭流 fputc()写一个字符到流中 fgetc()从流中读一个字符 fseek()在流中定位到指定的字符 fputs()写字符串到流 fgets()从流中读一行或指定个字符 fprintf()按格式输出到流 fscanf()从流中按格式读取 feof()到达文件尾时返回真值 ferror()发生错误时返回其值 rewind()复位文件定位器到文件开始处 remove()删除文件 fread()从流中读指定个数的字符 fwrite()向流中写指定个数的字符 tmpfile()生成一个临时文件流 tmpnam()生成一个唯一的文件名 下面就介绍一下这些函数 1.fopen() fopen的原型是:FILE*fopen(const char*filename,const char*mode),fopen实现三个功 Linux下C语言的文件(fputc,fgetc,fwrite,fread对文件读写操 作) //================================== fputc 向文件写入字符 #include FILE *fp; int i; if((fp=fopen(argv[1],"r"))==NULL) { printf("不能打开文件\n"); exit(0); } while ((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp); } 文件结尾,通过判断EOF //============================================================== fwrite 的使用 使数组或结构体等类型可以进行一次性读写 #include C程序文件的读写操作 在对文件进行读、写操作之前,首先要解决的问题是如何把程序中要读、写的文件与磁盘上实际的数据文件联系起来。在c语言中,其实这并不困难,只需要用c语言提供的库函数fopen“打开”文件就可以实现这些联系。Fopen函数的一般调用形式为: Fopen(文件名,文件使用方式); 函数返回一个指向file类型的指针。例如: FILE *fp; /*****定义一个文件指针*/ fp=fopen(”file_a”,”r”); foen函数调用中用两个字符串作为参数。第一个字符串中包含了进行读、写操作的文件名,用来指定所要打开的文件。在本例中,指定的函数名:file_a。第二个字符串中指定了文件的使用方式,用户可通过这个参数来指定对文件的使用意图。 如果以上函数调用成功,函数返回一个fille类型的指针,付给指针变量fp,从而把指针fp与文件file_a联系起来,也就是说,在此调用之后,指针fp就指向了文件file_a。 C语言中,最常用的文件使用用方式及其含义如下: (1)“r”。为读而打开文本文件。当指定这种形式时,对打开的文件只能进行“读”操作。若制定的文件不存在,则会出错,若去读一个不允许读的文件时也会出错。 (2)“rb”。为读而打开一个二进制文件,其余如“r”功能。 (3)“w”。为写而打开文本文件。这是。如果指定的文件不存在,系统将在指定位置建立一个新文件;如果文件已经存在,则将从文件的起始位置开始写,文件中原有内容将全部覆盖。 (4)“WB”. 为读而打开一个二进制文件,其余如“w”功能。 (5)“a”。为在文件后面添加数据而打开文本文件。这是。如果指定的文件不存在,系统将在指定位置建立一个新文件;如果文件已经存在,则将从文件的末尾位置开始写,文件中原有内容将保留。 (6)“ab”。为读而打开一个二进制文件,其余如“a”功能。 (7)“r+”。为读和写而打开文本文件。用这种方式时,指定的文件应当已经存在,既可以对文件进行读,也可以进行写。读写都是从文件起始位置开始。 关闭文件: fclose(文件指针); 程序例子: #include C语言读写文件操作 #include C语言中文件,数据的输入输出,读写. 文件是数据的集合体,对文件的处理过程就是对文件的读写过程,或输入输出过程。 所谓文件是指内存以外的媒体上以某种形式组织的一组相关数据的有序集合。文件分类: 顺序文件,随机文件。 文本文件和二进制文件。 文本文件也称为ASCII文件,在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。 文本文件可以在屏幕上按字符显示,源程序文件就是文本文件,由于是按字符显示,所以能读懂文件内容。 二进制文件是按二进制编码方式来存放的。这里主要讨论文件的打开,关闭,读,写,定位等操作。 文件的存取方法 C程序的输入输出(I/O)有两种方式:一种称为标准I/O或流式I/O,另一种称为低级I/O。流式I/O是依靠标准库函数中的输入输出函数实现的。低级I/O利用操作系统提供的接口函数(称为底层接口或系统调用)实现输入输出,低级I/O 主要提供系统软件使用。 在C语言中用一个FILE类型的指针变量指向一个文件,(FILE类型是系统在stdio.h中定义的描述已打开文件的一种结构类型),这个指针称为文件指针。FILE *指针变量标识符; 如 FILE *fp; 文件的打开与关闭 所谓打开文件,指的是建立文件的各种有关信息,并使文件指针指向该文件,以便对它进行操作。 关闭文件则是断开指针与文件之间的联系,也就禁止再对该文件进行操作。 1、fopen 函数原型:FILE *fopen(const char *filename,const char *mode); Fopen函数用来打开一个文件,前一部分用来说明文件路径及文件名,后一部分mode指出了打开文件的存取方式;返回值是被打开文件的FILE型指针,若打开失败,则返回NULL。打开文件的语法格式如下: 文件指针名=fopen(文件名,使用文件方式); 文件指针名必须被说明为FILE类型的指针变量。 FILE *fp; fp=fopen(“C:\\Windowss\\abc.txt”,”r”); 注意用两个反斜杠\\来表示目录间的间隔符。 存取文件的模式是一个字符串,可以由字母r,w,a,t,b及+组合而成,各字符的含 C语言文件读写函数 1.fopen() fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen 实现三个功能:为使用而打开一个流,把一个文件和此流相连接,给此流返回一个FILR指针。 参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下: 字符串含义 "r" 以只读方式打开文件 "w" 以只写方式打开文件 "a" 以追加方式打开文件 "r+" 以读/写方式打开文件,如无文件出错 "w+" 以读/写方式打开文件,如无文件生成新文件 一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符’/n’,而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。 系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而 _fmode=O_BINARY;则设置默认打开方式是二进制模式。 我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。 此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL. 例: 以下是引用片段: FILE *fp; if(fp=fopen("123.456","wb")) puts("打开文件成功"); else puts("打开文件成败"); 2.fclose() fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。 在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的错误。 例:fclose(fp); 3.fputc() C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof 表头文件 #include C语言中对文件进行操作如何使用绝对路径? 我编了一个小程序试了一下,好像默认的路径是在生成的.exe文件所在目录下。如果使用像D:\\ABC.TXT这样的路径可以在D盘下对ABC.TXT进行操作,但如果使用D:\\SSS\ABC.TXT就不正确了,创建的文件是SSSABC.TXT,不支持多级的路径,它把路径和文件名弄混了。 到底怎么办 D:\\SSS\\ABC.TXT //你少了个\,在C字符串中,出现\的地方,你一律打两个\\就行了。 请问啊,C语言里,fopen、fread与fwrite的参数中,要求文件名,用写盘符吗? 写绝对路径吗?#include C语言文件读写(基于缓冲技术) Syd168 2011.10.1 当文件按指定的工作方式打开以后,就可以执行对文件的读和写。下面按文件的性质分类进行操作。针对文本文件和二进制文件的不同性质,对文本文件来说,可按字符读写或按字符串读写;对二进制文件来说,可进行成块的读写或格式化的读写。 0. 文件打开与关闭 1. 读写字符 C提供fgetc和fputc函数对文本文件进行字符的读写,其函数的原型存于stdio.h头文件中,格式为: ?int fgetc(FILE *stream) fgetc( )函数从输入流的当前位置返回一个字符,并将文件指针指示器移到下一个字符处,如果已到文件尾,函数返回EOF,此时表示本次操作结束,若读写文件完成,则应关闭文件。 ?int fputc(int ch,FILE *stream) fputc()函数完成将字符c h的值写入所指定的流文件的当前位置处,并将文件指针后移一位。 fputc()函数的返回值是所写入字符的值,出错时返回EOF。 [例] 将存放于磁盘的指定文本文件按读写字符方式逐个地从文件读出,然后再将其显示到屏幕上。 采用带参数的main( ),指定的磁盘文件名由命令行方式通过键盘给定。 参数argc是用于记录输入参数的个数,argv是指针数组,用于存放输入参数的字符串,串的个数由argc描述。假设我们指定读取的文件名为L8-2.c,并且列表文件内容就是源程序。经过编译和连接生成可执行的文件L8-2.exe。运行程序l8-2.exe,输入的命令行方式为: c:\tc>l8-2 L8-2.c 上述程序以命令行方式运行,其输入参数字符串有两个,即argv[0]="c:\tc>l8-2"、argv[1]=" L8-2.c ",argc = 2。故打开的文件是L8-2.c 。程序中对fgetc( )函数的返回值不断进行测试,若读到文件尾部或读文件出错,都将返回C的整型常量EOF,其值为非零有效整数。程序的运行输出为源程序本身:c:\tc>l8-2 L8-2.c C语言文件选择题(答案在最后) 1、标准库函数fgets(s,n,f)的功能是 A) 从文件f中读取长度为n的字符串存入指针s所指的内存 B) 从文件f中读取长度不超过n-1的字符串存入指针s所指的内存 C) 从文件f中读取n个字符串存入指针s所指的内存 D) 从文件f中读取长度为n-1的字符串存入指针s所指的内存 2、在C中,对文件的存取以________为单位 A) 记录B) 字节 C) 元素D) 簇 3、下面的变量表示文件指针变量的是 A) FILE *fp B) FILE fp C) FILER *fp D) file *fp 4、在C中,下面对文件的叙述正确的是 A) 用“r”方式打开的文件只能向文件写数据 B) 用“R”方式也可以打开文件 C) 用“w”方式打开的文件只能用于向文件写数据,且该文件可以不存在 D) 用“a”方式可以打开不存在的文件 5、在C中,当文件指针变fp已指向“文件结束”,则函数feof(fp)的值是 A) .t. B) .F. C) 0 D) 1 6、在C中,系统自动定义了3个文件指针stdin,stdout和stderr分别指向终端输入、终端输出和标准出错输出,则函数fputc(ch,stdout)的功能是 A) 从键盘输入一个字符给字符变量ch B) 在屏幕上输出字符变量ch的值 C) 将字符变量的值写入文件stdout中 D) 将字符变量ch的值赋给stdout 7、下面程序段的功能是 #include 文件 文件是数据的集合体,对文件的处理过程就是对文件的读写过程,或输入输出过程。 所谓文件是指内存以外的媒体上以某种形式组织的一组相关数据的有序集合。文件分类: 顺序文件,随机文件。 文本文件和二进制文件。 文本文件也称为ASCII文件,在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。 文本文件可以在屏幕上按字符显示,源程序文件就是文本文件,由于是按字符显示,所以能读懂文件内容。 二进制文件是按二进制编码方式来存放的。这里主要讨论文件的打开,关闭,读,写,定位等操作。 文件的存取方法 C程序的输入输出(I/O)有两种方式:一种称为标准I/O或流式I/O,另一种称为低级I/O。流式I/O是依靠标准库函数中的输入输出函数实现的。低级I/O利用操作系统提供的接口函数(称为底层接口或系统调用)实现输入输出,低级I/O 主要提供系统软件使用。 在C语言中用一个FILE类型的指针变量指向一个文件,(FILE类型是系统在stdio.h中定义的描述已打开文件的一种结构类型),这个指针称为文件指针。FILE *指针变量标识符; 如 FILE *fp; 文件的打开与关闭 所谓打开文件,指的是建立文件的各种有关信息,并使文件指针指向该文件,以便对它进行操作。 关闭文件则是断开指针与文件之间的联系,也就禁止再对该文件进行操作。 1、fopen 函数原型:FILE *fopen(const char *filename,const char *mode); Fopen函数用来打开一个文件,前一部分用来说明文件路径及文件名,后一部分mode指出了打开文件的存取方式;返回值是被打开文件的FILE型指针,若打开失败,则返回NULL。打开文件的语法格式如下: 文件指针名=fopen(文件名,使用文件方式); 文件指针名必须被说明为FILE类型的指针变量。 /*C语言使用文件打开文本文件读写的例子*/ 例1:功能:以文本方式生成一个文件,将"50 100 150"等数字输出到 文件中 #include C语言文件读写 -- C语言的文件操作 文件的基本概念 所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件(头文件)等。文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来。从不同的角度可对文件作不同的分类。从用户的角度看,文件可分为普通文件和设备文件两种。 普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目标文件、可执行程序;也可以是一组待输入处理的原始数据,或者是一组输出的结果。对于源文件、目标文件、可执行程序可以称作程序文件,对输入输出数据可称作数据文件。 设备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等。在操作系统中,把外部设备也看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。通常把显示器定义为标准输出文件,一般情况下在屏幕上显示有关信息就是向标准输出文件输出。如前面经常使用的pri ntf,putchar 函数就是这类输出。键盘通常被指定标准的输入文件,从键盘上输入就意味着从标准输入文件上输入数据。scanf,getchar函数就属于这类输入。 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。 ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为: ASC码:00110101 00110110 00110111 00111000 ↓ ↓↓ ↓ 十进制码:5678 共占用4个字节。ASCII码文件可在屏幕上按字符显示,例如源程序文件就是ASCII文件,用DOS命令TY PE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为:00010110 00101110只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。 本章讨论流式文件的打开、关闭、读、写、定位等各种操作。文件指针在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。定义说明文件指针的一般形式为:FILE* 指针变量标识符;其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。在编写源程 include C语言文件操作函数大全(超详细) 作者: 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下 fopen(打开文件)相关函数open,fclose 表头文件#include C语言程序可以同时处理多个文件,为了对每一个文件进行有效的管理,在打开一个文件时,系统会自动地在内存中开辟一个区,用来存放文件的有关信息(如文件名、文件状态等) 这些信息保存在一个结构体变量中,该结构体是由系统定义的,取名为FILE。FILE定义在头文件stdio.h中。 对每一个要进行操作的文件,都需要定义一个指向FILE类型结构体的指针变量,该指针称为文件类型指针,文件类型指针的定义方法如下: FILE *指针变量; 如:FILE *fp; fp是一个指向FILE类型结构体的指针变量。当fp和某个文件建立关联之后,通过fp 即可找到存放该文件信息的结构变量,然后按结构变量提供的信息找到该文件,实施对文件的操作。 文件打开函数fopen() ?Fopen 函数的作用: 以指定方式打开指定文件。 打开成功,返回一个文件类型指针; 打开失败,则返回一个空指针NULL。 格式: FILE *文件指针变量; 文件指针变量=fopen(“文件名”, “文件使用方式”); “文件名”指要打开文件的名称。 “文件使用方式”指文件的类型和操作要求。如下表所示: 通常打开文件的方法: ? FILE *文件指针变量; 文件指针变量=fopen(“文件名”, “文件使用方式”); If(文件指针变量= =NULL) { printf(“cannot open this file\n”); exit(0); } 注:当打开文件出错时,函数 fopen 会返回一个空指针NULL 出错原因可能是以“r”方式打开一个不存在的文件,或者是磁盘已满等。关闭文件的函数: fclose(文件指针变量); 功能:用来关闭文件指针变量所指向的文件。成功返回0,否则返回非零值。 如:fclose(fp); 注:1 使用完一个文件后应即时关闭。否则会浪费系统资源。 2 关闭文件后,文件指针变量不再指向该文件,不能再通过该指针对该文件继续进行读写操作,除非再次打开该文件,使该指针变量重新指向该文件。 C语言实现myql中存取二进制文件 include #include c语言程序中文件的操 作 文件排版存档编号:[UYTR-OUPT28-KBNTL98-UYNN208] 文件操作函数 C语言 (FILE fputc fgetc fputs fgets fscanf fprintf) 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。 一、流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在中定义如下: typedef struct { int level; /* fill/empty level of buffer */ unsigned flags; /* File status flags */ char fd; /* File descriptor */ unsigned char hold; /* Ungetc char if no buffer */ int bsize; /* Buffer size */ unsigned char _FAR *buffer; /* Data transfer buffer */ unsigned char _FAR *curp; /* Current active pointer */ unsigned istemp; /* Temporary file indicator */ short token; /* Used for validity checking */ } FILE; /* This is the FILE object */ FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表函数功能 fopen() 打开流 fclose() 关闭流 fputc() 写一个字符到流中 #includeC语言程序中关于文件的操作
Linux下C语言的文件读写
c语言文件的读写格式
C语言读写文件操作
C语言中文件_数据的输入输出_读写
C语言文件读写函数集合
C语言文件操作命令
C语言文件操作之绝对路径
C语言文件读写
C语言文件选择题
C语言中文件,数据的输入输出,读写
C语言读写文件的例子
C语言文件读写
c语言读取csv文件
C语言文件操作函数大全(超详细)讲解
C语言文件读写函数
C语言实现读写二进制文件
c语言文件读写方法
c语言程序中文件的操作
C语言用指针和链表读写文件