文件的写入与读取

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

#define MAX_LINE_LENGTH 300  // 最大字符数

int count_chars(char* line) {  // 统计一行的字符数
    int count = 0;
    while (*line != '\0' && *line != '\n') {  // 遍历整行字符
        count++;
        line++;
    }
    return count;
}

int main() {
    FILE* fp;  // 文件指针

    // 打开文件进行写入,如果失败则输出错误信息并退出程序
    fp = fopen("D:\\高级语言程序设计\\实验二\\experiment1\\experiment1\\text01.txt", "w");
    if (fp == NULL) {
        printf("Error: open file failed.\n");
        exit(1);
    }

    int n;  // 行数
    char line[MAX_LINE_LENGTH + 2];  // 读入字符的行
    int char_count;  // 一行字符数
    while (1) {
        printf("请输入行数:");
        scanf("%d", &n);
        getchar();  // 消耗掉scanf缓存区中的换行符
        if (n == 0) break;
        for (int i = 0; i < n; i++) {
            printf("请输入第%d行:", i + 1);
            fgets(line, MAX_LINE_LENGTH + 2, stdin);  // 读入一行字符
            char_count = count_chars(line);  // 统计该行字符数
            fprintf(fp, "%d\n%s", char_count, line);  // 将字符数和字符写入文件
        }
    }
    fclose(fp);  // 关闭文件

    // 打开文件进行读取,如果失败则输出错误信息并退出程序
    fp = fopen("D:\\高级语言程序设计\\实验二\\experiment1\\experiment1\\text01.txt", "r");
    if (fp == NULL) {
        printf("Error: open file failed.\n");
        exit(1);
    }

    char_count = 0;  // 一行字符数
    while (fgets(line, MAX_LINE_LENGTH + 2, fp) != NULL) {
        int len = strlen(line);
        if (line[len - 1] == '\n') {  // 去掉fgets读入的换行符
            line[len - 1] = '\0';
        }
        if (char_count == 0) {  // 读取一行字符的长度
            sscanf(line, "%d", &char_count);
            printf("%s", line + 2);  // 将字符输出到屏幕上,注意+2
        }
        else {
            printf("%s", line);  // 将字符输出到屏幕上
        }
        if (count_chars(line) == char_count) {  // 当读入的字符数等于字符行中字符的个数时,应该换行
            putchar('\n');
            char_count = 0;  // 重置字符行长度
        }
    }
    fclose(fp);  // 关闭文件

    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值