评论

收藏

[C++] C语言文件函数和题目

编程语言 编程语言 发布于:2021-12-26 16:42 | 阅读数:352 | 评论:0

文件函数
打开关闭文件
文件操作
打开文件函数,关闭文件函数
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;
}