(2) fclose
(3)fread
(4)fwrite
(5)fgets
(6)fputs
先来看FILE结构体:
#ifndef _FILE_DEFINED
struct _iobuf {
char *_ptr;//文件缓存的当前位置
int _cnt;//缓存里可以读取的字节数
char *_base;//文件缓存的起始位置
int _flag;
int _file;
int _charbuf;
int _bufsiz;//缓存大小
char *_tmpfname;
};
typedef struct _iobuf FILE;
/***
*fgetc.c - get a character from a stream
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines fgetc() and getc() - read a character from a stream
*
*******************************************************************************/
#include
#include
#include
#include
#include
#include
/***
*int fgetc(stream), getc(stream) - read a character from a stream从流中读数据
*
*Purpose:
* reads a character from the given stream从已知流中读数据
*
*Entry:
* FILE *stream - stream to read character from进入
*
*Exit:
* returns the character read返回读取的值
* returns EOF if at end of file or error occurred
*
*Exceptions:
*
*******************************************************************************/
int __cdecl fgetc (REG1 FILE *stream)
{
int retval;
_ASSERTE(stream != NULL);
_lock_str(stream);//锁定
retval = _getc_lk(stream);//从流中读取
_unlock_str(stream);//取消锁定
return(retval);//返回值 :注意 是int类型!!
}
#undef getc
int __cdecl getc (
FILE *stream
)
{
return fgetc(stream);
}
/***
*fgets.c - get string from a file
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines fgets() - read a string from a file
*
*******************************************************************************/
#include
#include
#include
#include
#include
#include
#include
/***
*char *fgets(string, count, stream) - input string from a stream
*
*Purpose:
* get a string, up to count-1 chars or '\n', whichever comes first,
* append '\0' and put the whole thing into string. the '\n' IS included
* in the string. if count<=1 no input is requested. if EOF is found
* immediately, return NULL. if EOF found after chars read, let EOF
* finish the string as '\n' would.
*
*Entry:
* char *string - pointer to place to store string
* int count - max characters to place at string (include \0)
* FILE *stream - stream to read from三个参数
*
*Exit:
* returns string with text read from file in it.
* if count <= 0 return NULL
* if count == 1 put null string in string
* returns NULL if error or end-of-file found immediately
*
*Exceptions:
*
*******************************************************************************/
#ifdef _UNICODE
wchar_t * __cdecl fgetws (
#else /* _UNICODE */
char * __cdecl fgets (
#endif /* _UNICODE */
_TSCHAR *string,//用于储存的数组
int count,//个数
FILE *str
)
{
REG1 FILE *stream;
REG2 _TSCHAR *pointer = string;
_TSCHAR *retval = string;
int ch;
_ASSERTE(string != NULL);
_ASSERTE(str != NULL);
if (count <= 0)
return(NULL);
/* Init stream pointer */
stream = str;
_lock_str(stream);//锁定流
while (--count)
{
#ifdef _UNICODE
if ((ch = _getwc_lk(stream)) == WEOF)
#else /* _UNICODE */
if ((ch = _getc_lk(stream)) == EOF)//从流中得到一个字母 ,如果到末尾跳出
#endif /* _UNICODE */
{
if (pointer == string)
{
retval=NULL;
goto done;
}
break;
}
if ((*pointer++ = (_TSCHAR)ch) == _T('\n'))//把流中的值付给数组,当遇到\n时跳出
break;
}
*pointer = _T('\0');//最后加上\0
/* Common return */
done:
_unlock_str(stream);//解锁流 ,可能与flag有关
return(retval);
}
/***
*fread.c - read from a stream
*
* Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* Read from the specified stream into the user's buffer.
*
*******************************************************************************/
#include
#include
#include
#include
#include
#include
/***
*size_t fread(void *buffer, size_t size, size_t count, FILE *stream) -
* read from specified stream into the specified buffer.
*
*Purpose:
* Read 'count' items of size 'size' from the specified stream into
* the specified buffer. Return when 'count' items have been read in
* or no more items can be read from the stream.
*
*Entry:
* buffer - pointer to user's buffer
* size - size of the item to read in
* count - number of items to read
* stream - stream to read from
*
*Exit:
* Returns the number of (whole) items that were read into the buffer.
* This may be less than 'count' if an error or eof occurred. In this
* case, ferror() or feof() should be used to distinguish between the
* two conditions.
*
*Notes:
* fread will attempt to buffer the stream (side effect of the _filbuf
* call) if necessary.
*
* No more than 0xFFFE bytes may be read in at a time by a call to
* read(). Further, read() does not handle huge buffers. Therefore,
* in large data models, the read request is broken down into chunks
* that do not violate these considerations. Each of these chunks is
* processed much like an fread() call in a small data model (by a
* call to _nfread()).
*
* MTHREAD/DLL - Handled in three layers. fread() handles the locking
* and DS saving/loading/restoring (if required) and calls _fread_lk()
* to do the work. _fread_lk() is the same as the single-thread,
* large data model version of fread(). It breaks up the read request
* into digestible chunks and calls _nfread() to do the actual work.
*
* 386/MTHREAD/DLL - Handled in just the two layers since it is small
* data model. The outer layer, fread(), takes care of the stream locking
* and calls _fread_lk() to do the actual work. _fread_lk() is the same
* as the single-thread version of fread().
*
*******************************************************************************/
#ifdef _MT
/* define locking/unlocking version */
size_t __cdecl fread (
void *buffer,
size_t size,
size_t count,
FILE *stream
)
{
size_t retval;
_lock_str(stream); /* lock stream */
retval = _fread_lk(buffer, size, count, stream); /* do the read */
_unlock_str(stream); /* unlock stream */
return retval;
}
#endif /* _MT */
/* define the normal version */
#ifdef _MT
size_t __cdecl _fread_lk (
#else /* _MT */
size_t __cdecl fread (
#endif /* _MT */
void *buffer,
size_t size,
size_t num,
FILE *stream
)
{
char *data; /* point to where should be read next */
unsigned total; /* total bytes to read */
unsigned count; /* num bytes left to read */
unsigned bufsize; /* size of stream buffer */
unsigned nbytes; /* how much to read now */
unsigned nread; /* how much we did read */
int c; /* a temp char */
/* initialize local vars */
data = buffer;
if ( (count = total = size * num) == 0 )
return 0;
if (anybuf(stream))
/* already has buffer, use its size */
bufsize = stream->_bufsiz;
else
#if defined (_M_M68K) || defined (_M_MPPC)
/* assume will get BUFSIZ buffer */
bufsize = BUFSIZ;
#else /* defined (_M_M68K) || defined (_M_MPPC) */
/* assume will get _INTERNAL_BUFSIZ buffer */
bufsize = _INTERNAL_BUFSIZ;
#endif /* defined (_M_M68K) || defined (_M_MPPC) */
/* here is the main loop -- we go through here until we're done */
while (count != 0) {
/* if the buffer exists and has characters, copy them to user
buffer */
if (anybuf(stream) && stream->_cnt != 0) {
/* how much do we want? */
nbytes = (count < (unsigned)stream->_cnt) ? count : stream->_cnt;
memcpy(data, stream->_ptr, nbytes);
/* update stream and amt of data read */
count -= nbytes;
stream->_cnt -= nbytes;
stream->_ptr += nbytes;
data += nbytes;
}
else if (count >= bufsize) {
/* If we have more than bufsize chars to read, get data
by calling read with an integral number of bufsiz
blocks. Note that if the stream is text mode, read
will return less chars than we ordered. */
/* calc chars to read -- (count/bufsize) * bufsize */
nbytes = ( bufsize ? (count - count % bufsize) :
count );
nread = _read(_fileno(stream), data, nbytes);
if (nread == 0) {
/* end of file -- out of here */
stream->_flag |= _IOEOF;
return (total - count) / size;
}
else if (nread == (unsigned)-1) {
/* error -- out of here */
stream->_flag |= _IOERR;
return (total - count) / size;
}
/* update count and data to reflect read */
count -= nread;
data += nread;
}
else {
/* less than bufsize chars to read, so call _filbuf to
fill buffer */
if ((c = _filbuf(stream)) == EOF) {
/* error or eof, stream flags set by _filbuf */
return (total - count) / size;
}
/* _filbuf returned a char -- store it */
*data++ = (char) c;
--count;
/* update buffer size */
bufsize = stream->_bufsiz;
}
}
/* we finished successfully, so just return num */
return num;
}
welcome to xiyoulinux
#include
int main(int argc, char *argv[])
{
int i = 0;
FILE *fp = fopen("temp.txt", "w+");
char string[] = "WELCOME TO XIYOULINUX\n";
char secondstring[] = "welcome to xiyoulinux\n";
char temp[sizeof(string)];
for(i = 0; i<10; i++)
fputs(string, fp);
fseek(fp, 0, SEEK_SET);
while((fgets(temp, sizeof(string), fp)) != NULL)
{
fseek(fp, -(long)sizeof(temp), 1);
fputs(secondstring, fp);
}
fclose(fp);
return 0;
}
#include
#include
#include
#include
void printinfo(FILE *fp);
int main(int argc, char *argv[])
{
char ch;
int i = 0;
FILE *fp = fopen("temp.txt", "w+");
char string[] = "WELCOME TO XIYOULINUX\n";
char secondstring[] = "welcome to xiyoulinux\n";
char temp[sizeof(string)];
printf("%d\n\n",sizeof(string));
for(i = 0; i<10; i++)
{
printf("\n\n\n\*****%d*******before_fputs:*******************",i);
printf("\n");
printinfo(fp);
printf("\n");
printf("end\n");
printf("*******************end*************************");
fputs(string, fp);
printf("\n************after_fputs:*******************");
printf("\n");
printinfo(fp);
printf("\n");
printf("");
printf("all=%d\n",(fp->_bufsiz-fp->_cnt)/(sizeof(string)-1));
printf("****************end****************************\n\n\n\n");
getch();//停止,看一下文件
}
printf("before_fseek:%d\n",(fp->_bufsiz-fp->_cnt)/(sizeof(string)-1));
fseek(fp, 0, SEEK_SET);
printf("after_fseek||before_fgets:%d\n",(fp->_bufsiz-fp->_cnt)/(sizeof(string)-1));
printf("\n\n");
printinfo(fp);
printf("\n");
getch();//停止,查看文件
while((fgets(temp,sizeof(string),fp)) != NULL)
{
printf("\n*******************************************\n");
printf("after_fgets||before_fseek:\n");
printinfo(fp);
printf("1:\n%d\n",fp->_cnt/(sizeof(string)-1));
printf("%p\n",fp->_base);
for(i=0;i_cnt;i++) printf("%c",*(fp->_base+i));
printf("\n");
printf("%p\n",fp->_ptr);
for(i=0;i_cnt+50;i++) printf("%c",*(fp->_ptr+i));
printf("\n*******************************************\n");
fseek(fp, -(long)sizeof(temp), 1);
printf("\n*******************************************\n");
printf("after_fseek||before_fputs:\n");
printinfo(fp);
printf("\n");
printf("2:%d\n",fp->_cnt/(sizeof(string)-1));
printf("%p\n",fp->_base);
for(i=0;i_cnt+400;i++) printf("%c",*(fp->_base+i));
printf("\n");
printf("%p\n",fp->_ptr);
for(i=0;i_cnt+400;i++) printf("%c",*(fp->_ptr+i));
printf("\n*******************************************\n");
printf("\n\n");
fputs(secondstring, fp);
printf("\n*******************************************\n");
printf("after_fputs||before_fgets:\n");
printinfo(fp);
printf("\n");
printf("3:%d\n",fp->_cnt/(sizeof(string)-1));
printf("%p\n",fp->_base);
for(i=0;i_cnt;i++) printf("%c",*(fp->_base+i));
printf("\n");
printf("%p\n",fp->_ptr);
for(i=0;i_cnt;i++) printf("%c",*(fp->_ptr+i));
printf("\n*******************************************\n");
// fflush(fp);
// fseek(fp, 0, 1);
// fp->_flag=136;
// fp->_ptr=fp->_base;
// fp->_cnt=0;
printf("\n****************after_fseek***************************\n");
printinfo(fp);
printf("\n");
printf("4:%d\n",fp->_cnt/(sizeof(string)-1));
printf("%p\n",fp->_base);
for(i=0;i_cnt+400;i++) printf("%c",*(fp->_base+i));
printf("\n");
printf("%p\n",fp->_ptr);
for(i=0;i_cnt+400;i++) printf("%c",*(fp->_ptr+i));
printf("\n*******************************************\n");
printf("\n\n\n");
getch();
//break;
}
fclose(fp);
printf("after:fclose:\n");
printinfo(fp);
printf("\n");
printf("\n\n");
return 0;
}
void printinfo(FILE *fp)
{
printf("fp->_base:%p\n",fp->_base);
printf("fp->_bufsiz:%d\n",fp->_bufsiz);
printf("fp->_charbuf:%d\n",fp->_charbuf);
printf("fp->_cnt:%d\n",fp->_cnt);
printf("fp->_file:%d\n",fp->_file);
printf("fp->_flag:%d\n",fp->_flag);
printf("fp->_ptr=%p\n",fp->_ptr);
printf("fp->_tmpfname:%p\n",fp->_tmpfname);
}
#include
#include
#include
#include
void printinfo(FILE *fp);
int main(int argc, char *argv[])
{
char ch;
int i = 0;
FILE *fp = fopen("temp.txt", "w+");
char string[] = "WELCOME TO XIYOULINUX\n";
char secondstring[] = "welcome to xiyoulinux\n";
char temp[sizeof(string)];
printf("%d\n\n",sizeof(string));
for(i = 0; i<10; i++)
{
printf("\n\n\n\*****%d*******before_fputs:*******************",i);
printf("\n");
printinfo(fp);
printf("\n");
printf("end\n");
printf("*******************end*************************");
fputs(string, fp);
printf("\n************after_fputs:*******************");
printf("\n");
printinfo(fp);
printf("\n");
printf("");
printf("all=%d\n",(fp->_bufsiz-fp->_cnt)/(sizeof(string)-1));
printf("****************end****************************\n\n\n\n");
//getch();
}
printf("before_fseek:%d\n",(fp->_bufsiz-fp->_cnt)/(sizeof(string)-1));
fseek(fp, 0, SEEK_SET);
printf("after_fseek||before_fgets:%d\n",(fp->_bufsiz-fp->_cnt)/(sizeof(string)-1));
printf("\n\n");
printinfo(fp);
printf("\n");
// getch();
while((fgets(temp,sizeof(string),fp)) != NULL)
{
printf("cur=fgets\n");
getch();
printf("\n*******************************************\n");
printf("after_fgets||before_fseek:\n");
printinfo(fp);
printf("1:\n%d\n",fp->_cnt/(sizeof(string)-1));
printf("%p\n",fp->_base);
for(i=0;i_cnt+50;i++) printf("%c",*(fp->_base+i));
printf("\n");
printf("%p\n",fp->_ptr);
for(i=0;i_cnt+50;i++) printf("%c",*(fp->_ptr+i));
printf("\n*******************************************\n");
fseek(fp, -(long)sizeof(temp), 1);
printf("cur=fseek\n");
getch();
printf("\n*******************************************\n");
printf("after_fseek||before_fputs:\n");
printinfo(fp);
printf("\n");
printf("2:%d\n",fp->_cnt/(sizeof(string)-1));
printf("%p\n",fp->_base);
for(i=0;i_cnt+400;i++) printf("%c",*(fp->_base+i));
printf("\n");
printf("%p\n",fp->_ptr);
for(i=0;i_cnt+400;i++) printf("%c",*(fp->_ptr+i));
printf("\n*******************************************\n");
printf("\n\n");
fputs(secondstring, fp);
printf("cur=fputs\n");
getch();
printf("\n*******************************************\n");
printf("after_fputs||before_fgets:\n");
printinfo(fp);
printf("\n");
printf("3:%d\n",fp->_cnt/(sizeof(string)-1));
printf("%p\n",fp->_base);
for(i=0;i_cnt;i++) printf("%c",*(fp->_base+i));
printf("\n");
printf("%p\n",fp->_ptr);
for(i=0;i_cnt;i++) printf("%c",*(fp->_ptr+i));
printf("\n*******************************************\n");
// fflush(fp);
//fputs(secondstring, fp);
//getch();
//fseek(fp, 0, 1);
// rewind(fp);
// fp->_flag=136;
// fp->_ptr=fp->_base;
// fp->_cnt=0;
/*printf("\n****************after_fseek***************************\n");
printinfo(fp);
printf("\n");
printf("4:%d\n",fp->_cnt/(sizeof(string)-1));
printf("%p\n",fp->_base);
for(i=0;i_cnt+400;i++) printf("%c",*(fp->_base+i));
printf("\n");
printf("%p\n",fp->_ptr);
for(i=0;i_cnt+400;i++) printf("%c",*(fp->_ptr+i));
printf("\n*******************************************\n");
printf("\n\n\n");
*/
//break;
}
fclose(fp);
printf("after:fclose:\n");
printinfo(fp);
printf("\n");
printf("\n\n");
return 0;
}
void printinfo(FILE *fp)
{
printf("fp->_base:%p\n",fp->_base);
printf("fp->_bufsiz:%d\n",fp->_bufsiz);
printf("fp->_charbuf:%d\n",fp->_charbuf);
printf("fp->_cnt:%d\n",fp->_cnt);
printf("fp->_file:%d\n",fp->_file);
printf("fp->_flag:%d\n",fp->_flag);
printf("fp->_ptr=%p\n",fp->_ptr);
printf("fp->_tmpfname:%p\n",fp->_tmpfname);
}
#include
#include
#include
#include
void printinfo(FILE *fp);
int main(int argc, char *argv[])
{
char ch;
int i = 0,flag=0;
FILE *fp = fopen("temp.txt", "w+");
char string1[] = "1WELCOME TO XIYOULINUX\n";
char string2[] = "2WELCOME TO XIYOULINUX\n";
char string3[] = "3WELCOME TO XIYOULINUX\n";
char string4[] = "4WELCOME TO XIYOULINUX\n";
char string5[] = "5WELCOME TO XIYOULINUX\n";
char string6[] = "6WELCOME TO XIYOULINUX\n";
char string7[] = "7WELCOME TO XIYOULINUX\n";
char string8[] = "8WELCOME TO XIYOULINUX\n";
char string9[] = "9WELCOME TO XIYOULINUX\n";
char string10[] = "0WELCOME TO XIYOULINUX\n";
char secondstring[] = "0welcome to xiyoulinux\n";
char secondstring1[] = "1welcome to xiyoulinux\n";
char secondstring2[] = "2welcome to xiyoulinux\n";
char secondstring3[] = "3welcome to xiyoulinux\n";
char secondstring4[] = "4welcome to xiyoulinux\n";
char temp[sizeof(string1)];
printf("\n\n\n*****%d*******before_fputs:*******************",i);
printf("\n");
printinfo(fp);
printf("\n");
printf("end\n");
printf("*******************end*************************");
fputs(string1, fp);
fputs(string2, fp);
fputs(string3, fp);
fputs(string4, fp);
fputs(string5, fp);
fputs(string6, fp);
fputs(string7, fp);
fputs(string8, fp);
fputs(string9, fp);
fputs(string10, fp);
/*for(i = 0; i<10; i++)
{
printf("\n\n\n\*****%d*******before_fputs:*******************",i);
printf("\n");
printinfo(fp);
printf("\n");
printf("end\n");
printf("*******************end*************************");
fputs(string, fp);
printf("\n************after_fputs:*******************");
printf("\n");
printinfo(fp);
printf("\n");
printf("");
printf("all=%d\n",(fp->_bufsiz-fp->_cnt)/(sizeof(string)-1));
printf("****************end****************************\n\n\n\n");
//getch();
}*/
printf("\n************after_fputs:*******************");
printf("\n");
printinfo(fp);
printf("\n");
printf("all=%d\n",(fp->_bufsiz-fp->_cnt)/(sizeof(string1)-1));
printf("****************end****************************\n\n\n\n");
printf("before_fseek:%d\n",(fp->_bufsiz-fp->_cnt)/(sizeof(string1)-1));
fseek(fp, 0, SEEK_SET);
printf("after_fseek||before_fgets:%d\n",(fp->_bufsiz-fp->_cnt)/(sizeof(string1)-1));
printf("\n\n");
printinfo(fp);
printf("\n");
// getch();
while((fgets(temp,sizeof(string1),fp)) != NULL)
{
flag++;
printf("\n*******************************************\n");
printf("file:%ld\n",ftell(fp));
printf("after_fgets||before_fseek:\n");
printinfo(fp);
printf("1:%d\n",fp->_cnt/(sizeof(string1)-1));
printf("%p\n",fp->_base);
for(i=0;i_cnt+50;i++) printf("%c",*(fp->_base+i));
printf("\n");
printf("%p\n",fp->_ptr);
for(i=0;i_cnt+50;i++) printf("%c",*(fp->_ptr+i));
printf("\n*******************************************\n");
printf("cur=fgets\n");
getch();
// fp->_ptr=fp->_base;
//fseek(fp, -(long)sizeof(temp), 1);
/*printf("\n*******************************************\n");
printf("%ld\n",ftell(fp));
printf("after_fseek||before_fputs:\n");
printinfo(fp);
printf("\n");
printf("2:%d\n",fp->_cnt/(sizeof(string1)-1));
printf("%p\n",fp->_base);
for(i=0;i_cnt+400;i++) printf("%c",*(fp->_base+i));
printf("\n");
printf("%p\n",fp->_ptr);
for(i=0;i_cnt+400;i++) printf("%c",*(fp->_ptr+i));
printf("\n*******************************************\n");
printf("\n\n");
printf("cur=fseek\n");
getch();*/
switch(flag)
{
case 1:
fputs(secondstring, fp);
break;
case 2:
fputs(secondstring1, fp);
break;
case 3:
fputs(secondstring2, fp);
break;
case 4:
fputs(secondstring3, fp);
break;
case 5:
fputs(secondstring4, fp);
break;
}
printf("\n*******************************************\n");
printf("%ld\n",ftell(fp));
printf("after_fputs||before_fgets:\n");
printinfo(fp);
printf("\n");
printf("3:%d\n",fp->_cnt/(sizeof(string1)-1));
printf("%p\n",fp->_base);
for(i=0;i_cnt;i++) printf("%c",*(fp->_base+i));
printf("\n");
printf("%p\n",fp->_ptr);
for(i=0;i_cnt;i++) printf("%c",*(fp->_ptr+i));
printf("\n*******************************************\n");
printf("cur=fputs\n");
getch();
//fflush(fp);
//fputs(secondstring, fp);
//getch();
// fseek(fp, -sizeof(string1), 1);
// rewind(fp);
// fp->_flag=136;
// fp->_ptr=fp->_base;
// fp->_cnt=0;
/* printf("\n****************after_fseek(fp, -sizeof(string1), 1)***************************\n");
printf("%ld\n",ftell(fp));
printinfo(fp);
printf("\n");
printf("4:%d\n",fp->_cnt/(sizeof(string1)-1));
printf("%p\n",fp->_base);
for(i=0;i_cnt+400;i++) printf("%c",*(fp->_base+i));
printf("\n");
printf("%p\n",fp->_ptr);
for(i=0;i_cnt+400;i++) printf("%c",*(fp->_ptr+i));
printf("\n*******************************************\n");
printf("\n");
printf("fseek(fp, -sizeof(string1), 1)");
getch();
*/
//break;
}
fclose(fp);
printf("after:fclose:\n");
printinfo(fp);
printf("\n");
printf("\n\n");
return 0;
}
void printinfo(FILE *fp)
{
printf("fp->_base:%p\n",fp->_base);
printf("fp->_bufsiz:%d\n",fp->_bufsiz);
printf("fp->_charbuf:%d\n",fp->_charbuf);
printf("fp->_cnt:%d\n",fp->_cnt);
printf("fp->_file:%d\n",fp->_file);
printf("fp->_flag:%d\n",fp->_flag);
printf("fp->_ptr=%p\n",fp->_ptr);
printf("fp->_tmpfname:%p\n",fp->_tmpfname);
}