Shun 发表于 2021-12-26 16:42:43

C语言文件函数和题目

文件函数
打开关闭文件

文件操作
打开文件函数,关闭文件函数
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 = { 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 = { 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;
};
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;
};
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;
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;
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;
int i;
float b;
};
int main()
{
struct S s = { 0 };
int a = 0;
char bs = { 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;
int i;
float b;
};
int main()
{
struct S s = { "asda",232, 5.5f };
struct S ds = { 0 };
char bs = { 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;
    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
      day += 1;
    printf("%d", day);
}

return 0;
}













https://blog.51cto.com/u_15409770/4845149
页: [1]
查看完整版本: C语言文件函数和题目