文件函数
打开关闭文件
文件操作
打开文件函数,关闭文件函数
int main()
{
FILE* p = fopen("shen.dat", "w");//打开文件函数格式
//p的类型是FILE类型的指针
if (p == NULL)
{
perror("fopen");
return 1;
}
fclose(p);//关闭文件的函数,如果没有这一步,到最后再打开别的文件会失败,引文占用过多的文件资源
p = NULL;
return 0;
}
输入流输出流
int main()
{
//从输入流里面读取并且打印
/*int ret = fgetc(stdin);
printf("%c\n", ret);*/
//从输入流里面读取并打印
/*int ret = fputc(stdout);这里的函数参数不对,出错
printf("%c\n", ret);*/
//流应该类比看作某种文件,把输入放到流文件里面,再把流文件中的内容读取到屏幕上
FILE* p = fopen("text,txt", "r");
char arr[10] = { 0 };
char *ptr=fgets(arr,4, p);
int i = 0;
printf("%s", ptr);
fclose(p);
p = NULL;
//从文件里面读取到
return 0;
}
标准流和文件里面的字符和字符串的的读取输入
//标注输入流stdin,标准输出流stdout,标准错误流strerr
他们的类型都是FILE*
int main()
{
FILE* p = fopen("text.txt", "r");
if (p == NULL)
{
perror("fopen");
return 1;
}
////使用文件,写入
//fputc('s', p);//标准输入函数,把输入放到输入流中,再将流中的东西,放到p指针只想的地方
//fputs('c', p);
////使用文件,写入字符串
//fputs("asdasasd\n", p);//标准输入函数,把输入放到输入流中,再将流中的东西,放到p指针只想的地方
//fputs("asdasdw\n", p);
////读取输出流
//fputc('c', stdout);
// //使用文件,读取
//int ret =fgetc(p);
////这里的fget从p里面读取了一个字符并返回他的ASCII码值
////标准输出函数,只能在只读的状态的情况下,
//printf("%c", ret);
//从输入流里面读取
int ret = fgetc(stdin);
printf("%c\n", ret);
ret = fgetc(stdin);
printf("%c\n", ret);
ret = fgetc(stdin);
printf("%c\n", ret);
////使用文件,读取字符串
//char arr[10] = { 0 };
//fgets(arr, 4, p);//标准输出函数,只能在只读的状态的情况下,
//// 目标地址 数量 文件指针
//printf("%s", arr);
fclose(p);
p = NULL;
return 0;
}
字符的输出
int main()
{
FILE* p = fopen("text.txt", "w");
//以"w"形式打开的时候,无论怎么样,都会把原来数据中的文件清空掉
//fputc('b', p);//我们可以把文件当成是一个人
//fputc('i', p);//put原本的意思是输出给人看,而在这里就是把前面的东西输出给文件看
//fputc('t', p);//写给计算机
fputc('b', stdout);
fputc('i', stdout);
fputc('t', stdout);
fclose(p);
p = NULL;
return 0;
}
字符串写入
int main()
{
FILE* p = fopen("text.txt", "w");
if (p == NULL)
{
peeror("open");
return 1;
}
fputs("asdasdas\n", p);
fputs("asdadaqwe\n", p);
fclose(p);
p = NULL;
return 0;
}
二进制转文本(ascii)写入
struct S
{
int arr;
char b[10];
};
int main()
{
struct S s = {232,"asd"};
FILE* p = fopen("text.txt", "w");
//fscanf(p, "%d %s", s.arr, s.b);
fprintf(p, "%d %s",s.arr,s.b);
fclose(p);
p = NULL;
return 0;
}
(ascii)文本转二进制输出
struct S
{
int arr;
char b[10];
};
int main()
{
struct S s = { 0 };
FILE* p = fopen("text.txt", "r");
fscanf(p, "%d %s", &(s.arr), s.b);
fprintf(stdout, "%d %s", s.arr, s.b);
fclose(p);
p = NULL;
return 0;
}
fprintf,fscanf针对的是文件,流,
fread和fwrite的使用
fread,fwrite针对的是内存地址
fread struct S
{
int a;
char b[10];
float c;
};
int main()
{
struct S s = { 232,"asdasd",5.5};
FILE* p = fopen("text.txt", "w");
if (p == NULL)
{
perror("fopen");
return 1;
}
fwrite(&s, sizeof(s), 1, p);
fclose(p);
p = NULL;
return 0;
}
fwrite struct S
{
int a;
char b[10];
float c;
};
int main()
{
struct S s = { 0 };
FILE* p = fopen("text.txt", "r");
if (p == NULL)
{
perror("fopen");
return 1;
}
fread(&s, sizeof(s), 1, p);
printf("%d %s %f", s.a, s.b, s.c);
fclose(p);
p = NULL;
return 0;
}
sscanf和sprintf的使用
struct S
{
char a[10];
int i;
float b;
};
int main()
{
struct S s = { 0 };
int a = 0;
char bs[20] = { 232,"asda", 5.5};
sscanf(&bs,"%d %s %f",&(s.a),s.i,&(s.b));
printf("%d %s %f", s.a, s.i, s.b);
return 0;
}
struct S
{
char a[10];
int i;
float b;
};
int main()
{
struct S s = { "asda",232, 5.5f };
struct S ds = { 0 };
char bs[100] = { 0 };
sprintf(bs, "%s %d %f", s.a, s.i, s.b);
// char* <- struct S
//将结构体转换成字符串
printf("%s\n", bs);
sscanf(bs, "%s %d %f", ds.a, &(ds.i), &(ds.b));
// char* -> struct S
//将字符串转换成char*
printf("%s %d %f", ds.a, ds.i, ds.b);
return 0;
}
文件指针函数
//文件指针函数
//fseek文件指针跳跃
//ftell文件指针返回文件指针偏移量
//rewind让文件指针回到起始位置
//SEEK_CUR文件指针指向当前位置
//SEEK_END文件指针指向文件末尾
//SEEK_SET文件指针指向文件开头
int main()
{
FILE* pf = fopen("text.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
int ret = fgetc(pf);
printf("%c\n", ret);
fseek(pf, 2, SEEK_CUR);//这里如果越界的话,会打印空格,然后换行
ret = fgetc( pf);//d
printf("%c\n", ret);
ret = fgetc( pf);//e
printf("%c\n", ret);
ret = ftell(pf);
printf("%d\n", ret);
rewind(pf);
ret = ftell(pf);
printf("%d\n", ret);
fclose(pf);
pf = NULL;
return 0;
}
fgetc读取失败返回EOF,成功返回ASCII
fgets读取失败返回NULL,成功返回首元素地址
fread读取失败(长度不足),结束读取,
文件判定函数 feof判断文件读取失败的原因:读取结束或读取错误
读取正确返回非零数,否则位0
上下两个函数相反
ferror读取正确返回0,读取失败返回非零数字
int main()
{
FILE* pf = fopen("texat.txt", "r");
if (ferror(pf))//error返回0表示读取成功,返回!0表示读取失败
{
printf("读取失败");
}
fclose(pf);
pf = NULL;
return 0;
}
文本复制
//将一个文件中的内容转移到另一个文件中
int main()
{
FILE* pf1 = fopen("text.txt", "r");
FILE* pf2 = fopen("text2.txt", "w");
if (pf1 == NULL || pf2 == NULL)
{
perror("fopen");
return 1;
}
int c = 0;
while ((c = fgetc(pf1)) != EOF)//需要再前面加上括号不然先判断后面
{
fputc(c, pf2);
}
//关闭文件
fclose(pf1);
pf1 = NULL;
fclose(pf2);
pf2 = NULL;
return 0;
}
文件缓存区
#include<windows.h>
int main()
{
FILE* pf = fopen("text.txt", "w");
printf("睡十秒\n");
Sleep(10000);
fputs("asdacd", pf);
printf("睡十秒\n");
Sleep(10000);
printf("清空缓存区\n");
fflush(pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
输入缓冲区,输出缓冲区
系统会在缓冲区满了之后再对立面的数据统一处理
C语言题目
题目1
输入一个数字,输出一个行和列与输入一致的大“X”号int main()
{
int a = 0;
while(scanf("%d", &a) != EOF)
{
int i = 0, j = 0;
for (i = 0;i < a;i++)
{
for (j = 0;j < a;j++)
{
if (i == j)printf("*");
else if (i + j == a - 1)printf("*");
else printf(" ");
}
printf("\n");
}
}
return 0;
}
题目2
输入7个数字,减去最大数和最小数,求平均数int main()
{
int a = 0;//输入
int i = 0;//循环数
int max = 0;
int min = 100;
int sum = 0;
for (i = 0;i < 7;i++)
{
scanf_s("%d", &a);
if (i > max)max = a;
if (i < min)min = a;
sum += a;
}
printf("%.2f", (sum - max - min) / 5.0);
return 0;
}
题目3
输入年月,求天数
int main()
{
int i = 0, year = 0;
int arr[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
while (scanf("%d %d", &i,&year) != EOF)
{
int day = arr[i];
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
day += 1;
printf("%d", day);
}
return 0;
}