2024-2025-1 20241415 《计算机基础与程序设计》第十二周学习总结

2024-2025-1 20241415《计算机基础与程序设计》第十二周学习总结

作业信息

这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计
这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十二周作业
这个作业的目标 复习巩固前面所学的内容
作业正文 https://www.cnblogs.com/zhaoshaoning/p/18607774

教材学习内容总结

  1. 文件的基本概念
    • 在C语言中,文件是存储在外部介质(如磁盘)上的数据的集合。它可以是程序文件(包含源代码等),也可以是数据文件(用于存储程序运行时需要的数据)。
    • 文件通常被视为字节序列,C语言可以对这些字节进行读取、写入和其他操作。每个文件都有一个文件名,通过文件名来识别和访问文件。例如,在Windows系统中,文件名可能是“example.txt”,在Linux系统中也类似,但文件名的命名规则可能因操作系统而略有差异。
  2. 文件指针
    • 文件指针是C语言中操作文件的关键。它是一个指向FILE类型结构体的指针。FILE结构体包含了文件的各种信息,如文件的当前位置、缓冲区信息等。
    • 要使用文件,首先需要声明一个文件指针。例如:FILE *fp;,这里fp就是一个文件指针,它可以用来指向一个打开的文件。
    • 在C标准库中,<stdio.h>头文件包含了文件操作相关的函数和FILE结构体的定义。所以在进行文件操作之前,需要包含这个头文件。
  3. 文件的打开与关闭
    • 打开文件:使用fopen()函数来打开文件。它的基本形式是FILE *fopen(const char *filename, const char *mode);
      • filename是要打开的文件名,可以包含路径。例如,在Windows系统中,如果文件在当前目录下,文件名可以是“data.txt”;如果在其他目录下,可能是“C:\Users\user\Documents\data.txt”(注意反斜杠的转义)。在Linux系统中,路径格式可能是“/home/user/data.txt”。
      • mode是打开文件的模式,常见的模式有:
        • "r":以只读方式打开文件。如果文件不存在,fopen()函数会返回NULL
        • "w":以只写方式打开文件。如果文件存在,会清空文件内容;如果文件不存在,则创建新文件。
        • "a":以追加方式打开文件。如果文件存在,写入的数据会追加到文件末尾;如果文件不存在,则创建新文件。
        • "r +":以读/写方式打开文件,文件必须存在。
        • "w +":以读/写方式打开文件。如果文件存在,会清空文件内容;如果文件不存在,则创建新文件。
        • "a +":以读/写方式打开文件,写入的数据会追加到文件末尾。如果文件不存在,则创建新文件。
    • 关闭文件:使用fclose()函数来关闭文件。例如:fclose(fp);,其中fp是已经打开的文件指针。关闭文件是一个良好的编程习惯,它可以确保数据被正确地写入文件,并且释放与文件相关的资源。如果不关闭文件,可能会导致数据丢失或资源泄漏。
  4. 文件的读写操作
    • 字符读写
      • fgetc()函数用于从文件中读取一个字符。它的基本形式是int fgetc(FILE *stream);,其中stream是文件指针。例如:
        FILE *fp;
        char ch;
        fp = fopen("test.txt", "r");
        if(fp!= NULL)
        {
            ch = fgetc(fp);
            while(ch!= EOF)
            {
                putchar(ch);
                ch = fgetc(fp);
            }
            fclose(fp);
        }
        
        上述代码打开一个名为“test.txt”的文件,然后使用fgetc()函数逐个字符地读取文件内容,并通过putchar()函数将字符输出到控制台,直到遇到文件结束标志EOF(End - Of - File)。
      • fputc()函数用于向文件中写入一个字符。它的基本形式是int fputc(int c, FILE *stream);,其中c是要写入的字符,stream是文件指针。例如:
        FILE *fp;
        char ch = 'A';
        fp = fopen("output.txt", "w");
        if(fp!= NULL)
        {
            fputc(ch, fp);
            fclose(fp);
        }
        
        这段代码打开一个名为“output.txt”的文件,然后使用fputc()函数将字符A写入文件,最后关闭文件。
    • 字符串读写
      • fgets()函数用于从文件中读取一个字符串。它的基本形式是char *fgets(char *s, int n, FILE *stream);,其中s是存储读取字符串的字符数组,n是最多读取的字符数(包括字符串结束符'\0'),stream是文件指针。例如:
        FILE *fp;
        char str[100];
        fp = fopen("test.txt", "r");
        if(fp!= NULL)
        {
            fgets(str, 100, fp);
            printf("%s", str);
            fclose(fp);
        }
        
        此代码从“test.txt”文件中读取最多99个字符(加上'\0'共100个字符)存储到str数组中,并将其输出到控制台。
      • fputs()函数用于向文件中写入一个字符串。它的基本形式是int fputs(const char *s, FILE *stream);,其中s是要写入的字符串,stream是文件指针。例如:
        FILE *fp;
        char str[] = "Hello, World!";
        fp = fopen("output.txt", "w");
        if(fp!= NULL)
        {
            fputs(str, fp);
            fclose(fp);
        }
        
        代码将字符串“Hello, World!”写入名为“output.txt”的文件中。
    • 格式化读写
      • fscanf()函数用于从文件中按照指定格式读取数据。它的基本形式是int fscanf(FILE *stream, const char *format,...);,与scanf()函数类似,但是它从文件而不是标准输入读取数据。例如:
        FILE *fp;
        int num;
        fp = fopen("data.txt", "r");
        if(fp!= NULL)
        {
            fscanf(fp, "%d", &num);
            printf("The number read from file is %d\n", num);
            fclose(fp);
        }
        
        这段代码从“data.txt”文件中读取一个整数存储到num变量中,并将其输出。
      • fprintf()函数用于向文件中按照指定格式写入数据。它的基本形式是int fprintf(FILE *stream, const char *format,...);,与printf()函数类似,但是它向文件而不是标准输出写入数据。例如:
        FILE *fp;
        int num = 10;
        fp = fopen("output.txt", "w");
        if(fp!= NULL)
        {
            fprintf(fp, "The number is %d", num);
            fclose(fp);
        }
        
        此代码将包含整数num值的字符串写入名为“output.txt”的文件中。
  5. 文件的定位操作
    • ftell()函数用于获取文件指针的当前位置。它的基本形式是long ftell(FILE *stream);,返回值是从文件开头到文件指针当前位置的字节数。例如:
      FILE *fp;
      long position;
      fp = fopen("test.txt", "r");
      if(fp!= NULL)
      {
          // 读取一些数据或者进行其他操作
          position = ftell(fp);
          printf("The current position of the file pointer is %ld\n", position);
          fclose(fp);
      }
      
    • fseek()函数用于设置文件指针的位置。它的基本形式是int fseek(FILE *stream, long offset, int whence);
      • offset是偏移量,whence是起始位置,whence可以有以下几种取值:
        • SEEK_SET:文件开头,偏移量是从文件开头开始计算。
        • SEEK_CUR:文件当前位置,偏移量是从文件指针当前位置开始计算。
        • SEEK_END:文件末尾,偏移量是从文件末尾开始计算(偏移量为负数时表示向文件开头方向移动)。例如:
          FILE *fp;
          fp = fopen("test.txt", "r");
          if(fp!= NULL)
          {
              fseek(fp, 5, SEEK_SET);
              // 从文件开头偏移5个字节后的位置开始读取或操作
              fclose(fp);
          }
          
    • rewind()函数用于将文件指针重新定位到文件开头。它的基本形式是void rewind(FILE *stream);。例如:
      FILE *fp;
      fp = fopen("test.txt", "r");
      if(fp!= NULL)
      {
          // 进行一些操作
          rewind(fp);
          // 重新从文件开头开始操作
          fclose(fp);
      }
      

教材学习中的问题和解决过程(先问 AI)

  • 问题1:在打开文件时应该怎样选择打开文件的方式,如只读、只写等?
  • 问题1解决方案:
  1. 只读方式("r")的选择情况

    • 当你的程序只需要从文件中获取信息,而不会对文件内容进行修改时,应该选择只读方式打开文件。例如,读取配置文件、读取文本内容用于显示或分析等场景。
    • 假设你有一个程序,它需要读取一个包含用户设置选项(如字体大小、颜色主题等)的配置文件config.ini。这个程序只需要获取这些设置信息来初始化界面,而不会改变配置文件的内容。此时就可以使用"r"模式打开文件,代码如下:
    FILE *fp;
    fp = fopen("config.ini", "r");
    if(fp == NULL)
    {
        // 处理文件打开失败的情况,比如打印错误信息并退出程序
        perror("Error opening file");
        return 1;
    }
    // 在这里使用fgetc、fgets、fscanf等函数读取文件内容
    fclose(fp);
    
    • 这种方式可以确保文件内容的完整性,因为程序没有权限修改文件内容。如果文件不存在,使用"r"模式打开时,fopen函数会返回NULL,所以在实际应用中需要检查文件是否成功打开。
  2. 只写方式("w")的选择情况

    • 当你需要创建一个新文件或者清空一个已存在文件的内容,并向其中写入数据时,选择只写方式。例如,生成一个新的日志文件来记录程序运行信息,或者创建一个新的数据文件来存储用户输入的数据等场景。
    • 比如,你要创建一个日志文件program.log来记录程序每次运行的时间和状态信息。每次程序运行时,都希望清空旧的日志内容并开始新的记录,就可以使用"w"模式打开文件,代码如下:
    FILE *fp;
    fp = fopen("program.log", "w");
    if(fp == NULL)
    {
        perror("Error opening file");
        return 1;
    }
    // 使用fprintf等函数写入日志信息,如记录程序启动时间
    time_t now;
    time(&now);
    fprintf(fp, "Program started at %s", ctime(&now));
    fclose(fp);
    
    • 注意,如果文件已经存在,使用"w"模式打开会清空文件中原有的内容。如果文件不存在,fopen函数会创建一个新的文件。
  3. 追加方式("a")的选择情况

    • 当你希望在文件末尾添加新的数据,而不影响文件中已有的内容时,使用追加方式。例如,记录程序的运行历史记录,每次程序运行添加新的一行记录;或者收集用户的操作日志,不断在日志文件末尾添加新的操作记录等场景。
    • 假设你有一个简单的计数器程序,每次运行时,它要将当前的运行次数追加到一个文件count.txt中。代码如下:
    FILE *fp;
    int count = 1;  // 假设这是第1次运行,实际可以从文件读取之前的计数并加1
    fp = fopen("count.txt", "a");
    if(fp == NULL)
    {
        perror("Error opening file");
        return 1;
    }
    fprintf(fp, "Run %d\n", count);
    fclose(fp);
    
    • 使用"a"模式打开文件时,如果文件不存在,fopen函数会创建一个新文件;如果文件存在,则将写入的数据追加到文件的末尾。
  4. 读写方式("r +""w +""a +")的选择情况

    • "r +"模式
      • 当你需要读取和修改一个已经存在的文件内容时可以选择"r +"模式。例如,你有一个文本文件,里面存储了一些学生的成绩信息,你需要读取这些成绩进行分析,并且可能会修改某些成绩的值。
      • 但是要注意,使用"r +"模式打开文件时,文件必须已经存在,否则fopen函数会返回NULL
    • "w +"模式
      • 这种模式类似于"w"模式和"r"模式的结合。它会创建一个新文件或者清空已有文件内容,同时允许你对文件进行读写操作。例如,你要创建一个临时的数据文件,先写入一些初始数据,然后再读取这些数据进行处理。不过这种模式在实际应用中要谨慎使用,因为很容易不小心清空文件内容。
    • "a +"模式
      • 它允许你在文件末尾进行追加写入操作,同时也能读取文件内容。不过读取操作可能会受到文件指针位置的影响。例如,在追加一些数据后,如果你想读取文件开头的内容,可能需要先将文件指针移动到文件开头(使用rewindfseek函数)。这种模式适用于需要在记录新数据的同时,也可能需要查看之前记录的数据的情况,比如在更新日志文件的同时,也可以查看之前的日志记录。

基于AI的学习



posted @ 2024-12-15 11:11  雾岛岛岛  阅读(12)  评论(0编辑  收藏  举报