标准I/O 文件操作

文章提供了三个C语言程序示例,分别使用标准IO库实现了文件拷贝、文本内容反转和计算文本中单词个数的功能。文件拷贝通过逐字节读写完成,文本反转先读取到数组再逆序写回,单词计数则利用标志位判断字母连续性来统计。
摘要由CSDN通过智能技术生成

1.利用标准IO 实现拷贝文件功能

思路分析:
打开一个文件,读取文件内的内容,接着把读取的内容一个字节一个字节地写在要拷贝的文件上。

#include <stdio.h>
#include <sys/ioctl.h>

// 利用标准IO 实现拷贝文件功能,类似 cp xxx  xxx
int main(int argc, char *argv[])
{
    // 打开一个文件,要求文件必须存在
    FILE *fp1 = fopen(argv[1], "r+");
    if (!fp1)
    {
        printf("%s不存在!\n", argv[1]);
        return -1;
    }

    // 打开一个文件,文件不存在就创建,存在就内容清空
    FILE *fp2 = fopen(argv[2], "w+");
    if (!fp2)
    {
        printf("%s打开失败!\n", argv[2]);
        return -1;
    }

    char ch;
    int blockSize;

    while (1)
    {
        blockSize = fread(&ch, 1, 1, fp1);//一个字节一个字节地读
        if(blockSize <= 0)
        {
            break;
        }

        fwrite(&ch,1,1,fp2);//一个字节一个字节地写
    }
    fclose(fp1);
    fclose(fp2);
    return 0;
}

2.利用标准IO 实现文本内的数据反转

思路分析:
打开一个文件,利用数组计算,一字节一字节读的过程中文本的长度;然后通过数组的长度逆序写在文本中

#include <stdio.h>
#include <sys/ioctl.h>

// 利用标准IO 实现文本内的数据反转
int main(int argc, char *argv[])
{
    // 打开一个文件,要求文件必须存在
    FILE *fp = fopen(argv[1], "r+");
    if (!fp)
    {
        printf("%s不存在!\n",argv[1]);
        return -1;
    }

    char ch[1024];
    int blockSize;
    int i = 0;

    while (1)
    {
        blockSize = fread(&ch[i], 1, 1, fp);
        if (blockSize <= 0)
        {
            break;
        }
        i++;
    }

    fclose(fp);//关闭文件
    i -= 1;
    //重新打开文件
    FILE *fp1 = fopen(argv[1], "r+");
    while (i >= 0)
    {
        fwrite(&ch[i], 1, 1, fp1);
        i--;
    }
    fclose(fp1);
    return 0;
}

3.利用标准IO 获取文本中单词的个数

思路分析:(单个字母或连续的字母都算1个单词)
重点是要添加一个标志位,来让连续的字母只是记作一个单词
打开一个文件,在读文件的内容时,判断当前字符是否为字母,若是且标志位为0,则单词数量加1,标志位j加1;若不是,则让标志位为0
根据此操作,则可求出单词的个数。

#include <stdio.h>
#include <sys/ioctl.h>

// 利用标准IO 获取文本中单词的个数
int main(int argc, char *argv[])
{
    // 打开一个文件,要求文件必须存在
    FILE *fp = fopen(argv[1], "r+");
    if (!fp)
    {
        printf("%s不存在!\n", argv[1]);
        return -1;
    }

    int blockSize;
    char ch[1024];
    int i = 0;
    int flag = 0; // 标志数
    int num = 0;

    while (1)
    {
        blockSize = fread(&ch[i], 1, 1, fp);
        if (blockSize <= 0)
        {
            break;
        }
        if ((ch[i] >= 'a' && ch[i] <= 'z') || (ch[i] >= 'A' && ch[i] <= 'Z'))
        {
            if (flag == 0)//flag == 1表示有2个或2个以上字母才算单词
            {
                num++;
            }
            flag++;
        }
        else
        {
            flag = 0;
        }

        if (blockSize <= 0)
        {
            break;
        }

        i++;
    }
    printf("该文本中有%d个单词\n",num);

    fclose(fp);
    return 0;
}

.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

obsidianer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值