标准I/O 文件操作

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;
}

.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

obsidianer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值