Linux c编程 文件操作作业

a.txt文件内容如下:
32
45
65
32
67
454
89
54
24
75
3
67
890
32
1

1、编写一个程序读取a.txt文件,将文件内容数字从小到大排序,并将排序结果写入b.txt

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
void sort(int *a, int n)
{
    int i, j, temp;
    for (j = 0; j < n - 1; j++)
    {
        for (i = 0; i < n - 1 - j; i++)
        {
            if (a[i] > a[i + 1]) //数组元素大小按升序排列
            {
                temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
            }
        }
    }
}
int main()
{
    //读取a.txt
    FILE *fpa = NULL;
    fpa = fopen("a.txt", "r");
    if (fpa == NULL)
    {
        printf("fpa open error:%s", strerror(errno));
        return -1;
    }
    int buf[100];
    memset(buf, 0, sizeof(buf));
    char val[100];
    int iLen = 0;
    while (1)
    {
        memset(val, 0, sizeof(val));
        if (fgets(val, sizeof(val), fpa) == NULL)
        {
            break;
        }
        buf[iLen] = atoi(val);
        //printf("buf[%d]=%d\n", iLen, buf[iLen]);
        iLen++;
    }
    fclose(fpa);
    //排序
    sort(buf, iLen);
    //写入b.txt
    FILE *fpb = NULL;
    fpb = fopen("b.txt", "w");
    if (fpb == NULL)
    {
        printf("fpb open error:%s", strerror(errno));
        return -1;
    }
    int loop = 0;
    for (loop = 0; loop < iLen; loop++)
    {
        memset(val, 0, sizeof(val));
        sprintf(val, "%d\n", buf[loop]);
        fputs(val, fpb);
    }
    fclose(fpb);
    return 0;
}

2、通过读取/proc下的相关文件,得到系统CPU信息,内存信息。

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* 字符串解析*/
/*打开的文件,文件中要查找的字符串,返回的数据地址*/
//char *start;
char *parse_string(char *file, char *string)
{
    static char resultstr[100];
    memset(resultstr, 0, sizeof(resultstr));
    int fd;
    char pbuf[1024*10];
    int nread;
    char *ptmp;
    char *start;
    char *end;
    if (!file || !string)
    {
        return NULL;
    }
    /* 打开文件*/
    fd = open(file, O_RDONLY);
    if (fd < 0)
    {
        printf("open %s file error!\n", file);
        return NULL;
    }
    /*将文件读入缓冲区中*/
    nread = read(fd, pbuf, sizeof(pbuf));//将文件中的内容,存放到pbuf中
    if (nread < 0)
    {
        printf("read %s file error!", file);
        return NULL;
    }
    /* 查找文件中的字符串*/
    ptmp = strstr(pbuf, string);
    ptmp += strlen(string);//跳过查找到的字符串位置
    while((*ptmp == ' ') || (*ptmp == ':') || (*ptmp == '\t'))
        ptmp++;
    start = ptmp;
    end = strchr(ptmp, ' ');//查找到所需的数据
    *end = '\0';
    memcpy(resultstr, start, end-start);
    return resultstr;
}
int main()
{
    printf("%s\n", parse_string("/proc/meminfo", "MemFree"));
    return 0;
}

c.txt文件内容如下

index1 = 45

index2 = 36

index3 = 231

index4 = 43

index5 = 100

index6 = 123

index7 = 51

3、通过读取读取c.txt文件内容中等号右值,并将右值最大值,最小值和平均值打印到屏幕。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
char *TrimStrR(char *SrcStr) //去掉字符串右面的空格
{
    if (SrcStr == NULL)
        return NULL;
    int iLen = strlen(SrcStr);
    int i;
    for (i = (iLen - 1); i >= 0; i--)
    {
        if (SrcStr[i] == ' ')
            SrcStr[i] = 0;
        else
            break;
    }
    return SrcStr;
}
char *TrimStrL(char *SrcStr) //去掉字符串左面的空格
{
    if (SrcStr == NULL)
        return NULL;
    if (SrcStr[0] != ' ')
        return SrcStr;
    int iLen = strlen(SrcStr);
    if (iLen == 0)
        return SrcStr;
    char *sTmp = (char *) malloc(iLen + 1);
    memset(sTmp, 0, iLen + 1);
    memcpy(sTmp, SrcStr, iLen);
    int i;
    for (i = 0; i < iLen; i++)
    {
        if (SrcStr[i] != ' ')
        {
            strcpy(sTmp, SrcStr + i);
            break;
        }
    }
    strcpy(SrcStr, sTmp);
    free(sTmp);
    return SrcStr;
}
void ParseValueStr(char *DestStr, char *SrcStr) //解析带等号的字符串并去掉字符传尾部空格
{
    int iLen = strlen(SrcStr);
    if (iLen == 0)
        return;
    if ((SrcStr[iLen - 1] == '\n') || (SrcStr[iLen - 1] == '\r'))//为兼容windows格式文本文件,所以解析了\r字符
        SrcStr[iLen - 1] = '\0';
    if (iLen > 1)
    {
        if ((SrcStr[iLen - 2] == '\n') || (SrcStr[iLen - 2] == '\r'))//为兼容windows格式文本文件,所以解析了\r字符
            SrcStr[iLen - 2] = '\0';
    }
    TrimStrR(SrcStr); //去掉尾部空格
    int i;
    for (i = 0; i < iLen; i++)
    {
        if ((*SrcStr) == '=')
        {
            strcpy(DestStr, ++SrcStr);
            break;
        }
        ++SrcStr;
    }
    TrimStrL(DestStr); //去掉首部空格
}
int max(const int *buf, const int bufsize) //计算数组buf中的最大值,参数bufsize为数组buf的元素数量
{
    int tmp = buf[0];
    int i = 0;
    for (; i < bufsize; i++)
    {
        if (tmp <= buf[i])
            tmp = buf[i];
    }
    return tmp;
}
int min(const int *buf, const int bufsize) //计算数组buf中的最小值,参数bufsize为数组buf的元素数量
{
    int tmp = buf[0];
    int i = 0;
    for (; i < bufsize; i++)
    {
        if (tmp >= buf[i])
            tmp = buf[i];
    }
    return tmp;
}
float avg(const int *buf, const int bufsize) //计算数组buf中的平均值,参数bufsize为数组buf的元素数量
{
    float sum = 0;
    int i = 0;
    for (; i < bufsize; i++)
    {
        sum += buf[i];
    }
    return sum / bufsize;
}
int main(int arg, char *args[])
{
    const char *filename = "c.txt";
    FILE *f = fopen(filename, "r");
    if (f == NULL) //文件c.txt打开错误
    {
        printf("open %s failed %s\n", filename, strerror(errno));
        return -1;
    }
    char sValue[100];
    char buf[100];
    int iValue[1024];
    memset(iValue, 0, sizeof(iValue));
    int i = 0;
    while (!(feof(f)))//循环遍历文件中每一行
    {
        memset(sValue, 0, sizeof(sValue));
        memset(buf, 0, sizeof(buf));
        fgets(sValue, sizeof(sValue), f); //从c.txt文件中读取一行
        ParseValueStr(buf, sValue); //解析带等号的字符串并去掉字符传尾部空格
        iValue[i] = atoi(buf);
        i++; //累加器,记载c.txt文件中总行数
    }
    fclose(f);
    printf("最大值为%d\n", max(iValue, i));
    printf("最小值为%d\n", min(iValue, i));
    printf("平均值为%f\n", avg(iValue, i));
    return 0;
}
时间: 2024-08-04 02:56:17

Linux c编程 文件操作作业的相关文章

Linux中RPM文件操作的常用命令总结_Linux

简介 众所周知在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的"添加/删除程序",但是功能又比"添加/删除程序"强很多,它就是Red Hat Package Manager(简称RPM).本文介绍的就是关于Linux中RPM文件操作的常用命令,下面话不多说,来一起看看吧. 一.RPM 安装操作 命令: rpm -i 需要安装的包文件名 举例如下: rpm -i example.rpm 安装 example.rpm 包: rpm -iv e

线程-windows 和 linux 网络编程文件传输

问题描述 windows 和 linux 网络编程文件传输 windows 两个线程,linux 两个进程,现在想传输一个文件,windows 这边其中的一个进程传一部分,剩下的由另外的一个进程来传.有什么好的方法吗?找了好多可是都没有相关的资料.谢谢大家. 解决方案 就是socket通信传递,windows做客户端,linux做服务端 解决方案二: Linux与Windows下文件传输windows到linux的文件传输linux 和 windows 文件传输

Linux下C编程-----文件操作(1) 通过系统调用简单操作标准输入、标准输出、标准错误

Linux的 C系统调用操作  ,下面我们就来练习下 简单的系统调用操作 read系统调用测试 /************************************************************************* > File Name: read.c > Author: > Mail: > Created Time: Tue 10 Feb 2015 01:23:58 AM PST **********************************

Linux环境编程-文件基本操作

  Linux 下目录是/这样的 而windows是怎么记呢?和w是不是一样的反向?所以Linux的目录就是反的反向,好记了. 一:open函数 名称:open 目标:打开一个文件. 头文件:#include #include #include < fcntl.h> 函数原形:int open(const char * pathname,int flags); int open(const char * pathname,int flags,mode_t mode); 参数: pathname

【Linux系统编程】 Linux系统调用概述

系统调用概述 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组"特殊"接口.用户程序可以通过这组"特殊"接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件.关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等. 从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口--它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间. 系统服务之所以需要通过系统调

Linux下C编程:文件操作

由于文件操作网上的资源比较多,在这只简述下吧 在Linux 系统中,有关I/O 的操作可以分为两类.它们是基于文件描述符的I/O 操作和基于流的I/O 操作.它们有着各自不同的特点和优势.有些情况下它们是可以相互替代的, 有些情况下则不是.基于文件描述符的I/O 操作是通过文件描述符对一个文件执行I/O 操作的.文件是一个十分重要的概念.通常保存在外存中的数据都是以文件的形式保存的.文件描述符则是用于描述被打开文件的索引值.通常情况下,都是通过文件描述符打开一个文件执行I/O 操作的. 查看全套

Linux下C编程-----IO/文件操作 模拟linux ls程序显示文件系统树形结构(2)

Linux下的IO/文件操作练习,知识虽然简单 但是往往基础容易被忽略,偶尔的练习是有必要的.        练习printf /************************************************************************* > File Name: printf.c > Author: > Mail: > Created Time: Wed 11 Feb 2015 01:08:15 AM PST ****************

Linux下C编程-----IO/文件操作/内存映射 实现简单记录存储(3)

利用linux下的文件内存映射可以实现进程共享数据,我们可以把一个文件映射到虚拟内存中使多个进程进行共享, 到这里我们大概能想到他能应用到的领域 是很广泛的  主要涉及到 mmap  munmap   msync 三个函数的应用 下面贴代码  下面一段代码是为文件建立一个简单的记录存储,并且通过内存映射修改文件内容 /************************************************************************* > File Name: mem

使用技巧:对Java编程中的文件操作详解

编程|技巧|详解 一.获得控制台用户输入的信息 /** *//**获得控制台用户输入的信息 * @return * @throws IOException */ public String getInputMessage() throws IOException...{ System.out.println("请输入您的命令∶"); byte buffer[]=new byte[1024]; int count=System.in.read(buffer); char[] ch=new