要变优秀的科啊啊啊啊啊啊!!!

要变优秀的科啊啊啊啊啊啊!!!

1.fgetc 

        用于从文件中读取一个字符,fgetc 函数每次调用将会返回当前文件指针所指向的字符,并将文件指针指向下一个字符。


     int fgetc(FILE *stream);

      功能:
        从流中读取下一个字符
      参数:
        stream:文件流指针
      返回值:
        成功返回读到字符的ASCII码值
        失败返回EOF
        读到文件末尾返回EOF

#include <stdio.h>

int main(void)
{
	FILE *fp = NULL;
	char ch = 0;

	fp = fopen("file.txt", "r");
	if (NULL == fp)
	{
		perror("fail to fopen");
		return -1;
	}
	
	while (1)
	{
		ch = fgetc(fp);
		if (EOF == ch)  // 读到末尾退出循环
		{
			break;
		}
		printf("ch = %c\n", ch);
	}

	fclose(fp);

	return 0;
}

IO接口 2月5日学习笔记-LMLPHP

统计文件的行数   
 

#include <stdio.h>

int main(void)
{
	FILE *fp = NULL;
	char ch = 0;
	int cnt = 0;

	fp = fopen("file.txt", "r");
	if (NULL == fp)
	{
		perror("fail to fopen");
		return -1;
	}

	while (1)
	{
		ch = fgetc(fp);
		if (EOF == ch)
		{
			break;
		}

		if ('\n' == ch)
		{
			cnt++;
		}
	}

	fclose(fp);

	printf("cnt = %d\n", cnt);

	return 0;
}

  2.fgetc/fputc与getchar/putchar的区别


        char ch = 0;
        ch = getchar();
        ch = fgetc(stdin);

        char ch = 'a'
        putchar(ch);
        fputc(ch, stdout);

fgetc 和 fputc 主要用于文件操作,需要指定文件流作为参数;而getchar 和 putchar 主要用于标准输入输出,直接与控制台交互,不需要额外指定文件。

实现将一个文件中的内容拷贝到另一个文件中

#include <stdio.h>

int main(void)
{
	FILE *fsrc = NULL;
	FILE *fdst = NULL;
	char tmp = 0;

	fsrc = fopen("src.txt", "r");
	if (NULL == fsrc)
	{
		perror("fail to fopen");
		return -1;
	}

	fdst = fopen("dst.txt", "w");
	if (NULL == fdst)
	{
		perror("fail to fopen");
		return -1;
	}

	while (1)
	{
		tmp = fgetc(fsrc);
		if (EOF == tmp)
		{
			break;
		}
		fputc(tmp, fdst);
	}

	fclose(fsrc);
	fclose(fdst);

	return 0;
}

    3.fputs

         int fputs(const char *s, FILE *stream);
      功能:
        向流中写入一个字符串
      参数:
        s:字符串首地址
        stream:文件流指针
      返回值:
        成功返回非负数
        失败返回EOF

#include <stdio.h>

int main(void)
{
	FILE *fp = NULL;
	char str[32] = {"hello world"};

	fp = fopen("file.txt", "w");
	if (NULL == fp)
	{
		perror("fail to fopen");
		return -1;
	}

	fputs(str, fp);

	fclose(fp);

	return 0;
}

    4.fgets

 char *fgets(char *s, int size, FILE *stream);
      功能:
        从流中读取一个字符串
      参数:
        s:存放字符串空间首地址
        size:最多读取字符的个数
        stream:文件流指针
      返回值:
        成功返回存放字符串空间的首地址
        失败返回NULL
        读到文件末尾返回NULL

#include <stdio.h>

int main(void)
{
	FILE *fp = NULL;
	char tmpbuff[3] = {0};
	
	fp = fopen("file.txt", "r");
	if (NULL == fp)
	{
		perror("fail to fopen");
		return -1;
	}

	fgets(tmpbuff, sizeof(tmpbuff), fp);
	printf("tmpbuff = %s\n", tmpbuff);

	fclose(fp);

	return 0;
}

        gets和fgets区别:
        1.gets没有给定最多读取字符的个数,有越界风险
          fgets需要给定最多读取的字符个数,没有越界风险
        2.gets会去掉从终端接收的\n字符,换成\0字符
          fgets会保留从终端接收的\n字符,并在其末尾加入\0

        puts和fputs的区别
        1.puts会在字符串末尾多打印一个\n字符 
        2.fputs不会在末尾多打印\n字符

拷贝文件中的内容

#include <stdio.h>

int main(void)
{
	FILE *fsrc = NULL;
	FILE *fdst = NULL;
	char tmpbuff[4096] = {0};
	char *pret = NULL;

	fsrc = fopen("src.txt", "r");
	if (NULL == fsrc)
	{
		perror("fail to fopen");
		return -1;
	}

	fdst = fopen("dst.txt", "w");
	if (NULL == fdst)
	{
		perror("fail to fopen");
		return -1;
	}
	
	while (1)
	{
		pret = fgets(tmpbuff, sizeof(tmpbuff), fsrc);
		if (NULL == pret)
		{
			break;
		}
		fputs(tmpbuff, fdst);
	}

	fclose(fsrc);
	fclose(fdst);

	return 0;
}


5.fwrite 


      size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
      功能:
        向流中写入nmemb个对象,每个对象size字节大小,在ptr指向的空间中
      参数:
        ptr:存放数据空间的首地址
        size:每个数据对象的大小
        nmemb:数据对象的个数
        stream:文件流指针
      返回值:
        成功返回写入对象的个数
        失败返回0
        读到文件末尾返回0 

#include <stdio.h>

typedef struct student 
{
	char name[32];
	char sex;
	int age;
	int score;
}stu_t;

int main(void)
{
	stu_t a = {"zhangsan", 'm', 19, 100};
	stu_t b = {"lisi", 'f', 18, 90};
	stu_t s[3] = {
		{"zhaowu", 'm', 19, 100},
		{"maliu", 'f', 18, 65},
		{"tianqi", 'm', 17, 90},
	};
	FILE *fp = NULL;

	fp = fopen("file.txt", "w");
	if (NULL == fp)
	{
		perror("fail to fopen");
		return -1;
	}

	fwrite(&a, sizeof(stu_t), 1, fp);
	fwrite(&b, sizeof(stu_t), 1, fp);
	fwrite(s, sizeof(stu_t), 3, fp);

	fclose(fp);

	return 0;
}

   2.fread 
      size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
      功能:
        从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间中
      参数:
        ptr:存放读取内容空间首地址
        size:读取对象的大小
        nmemb:读取对象的个数
        stream:文件流指针 
      返回值:
        成功返回读到对象个数
        失败返回0
        读到文件末尾返回0 

   练习:
        1.利用fread和fwrite完成将src.jpg图片内容拷贝到dst.jpg图片中 
            char tmpbuff[4096];

    3.fprintf 
      int fprintf(FILE *stream, const char *format, ...);
      功能:
        将格式化字符串输出到stream指向的流中

        printf
        fprintf(stdout, );

    4.fsancf 
      int fscanf(FILE *stream, const char *format, ...);
      功能:
        从流中读取格式化的字符串
    
2.流的定位:
    1.ftell
      long ftell(FILE *stream);
      功能:
        获得流的偏移量

    2.rewind
      void rewind(FILE *stream);
      功能:
        将流的偏移量重新设置到开头

    3.fseek 
      int fseek(FILE *stream, long offset, int whence);
      功能:
        设置流的偏移量
      参数:
        stream:文件流指针
        offset:偏移量
            > 0 向后偏移
            < 0 向前偏移
        whence:
            SEEK_SET    文件开头
            SEEK_CUR    文件当前位置
            SEEK_END    文件末尾

#include <stdio.h>

int main(void)
{
	FILE *fp = NULL;

	fp = fopen("file.txt", "w");
	if (NULL == fp)
	{
		perror("fail to fopen");
		return -1;
	}

	fseek(fp, 10, SEEK_SET);
	fputc('a', fp);

	fseek(fp, -5, SEEK_CUR);
	fputc('b', fp);

	fseek(fp, 0, SEEK_SET);
	fputc('c', fp);

	fclose(fp);

	return 0;
}

    练习:从终端输入一个单词,获得单词的含义,格式如下

#include <stdio.h>
#include <string.h>

int main(void)
{
	char word[256] = {0};
	char tmpbuff[4096] = {0};
	FILE *fp = NULL;
	char *pret = NULL;
	char *ptmp = NULL;

	gets(word);

	fp = fopen("dict.txt", "r");
	if (NULL == fp)
	{
		perror("fail to fopen");
		return -1;
	}

	while (1)
	{
		pret = fgets(tmpbuff, sizeof(tmpbuff), fp);
		if (NULL == pret)
		{
			break;
		}

		ptmp = tmpbuff;
		while (*ptmp != ' ' && *ptmp != '\0')
		{
			ptmp++;
		}
		*ptmp = '\0';
		ptmp++;
		while (*ptmp == ' ')
		{
			ptmp++;
		}
		
		if (0 == strcmp(tmpbuff, word))
		{
			printf("%s", ptmp);
			fclose(fp);
			return 0;
		}
	}
	
	fclose(fp);
	printf("%s 单词不存在!\n", word);

	return 0;
}
03-05 17:16