文件(文本、二进制)读写,利用popen读取linux命令读取结果

1 文件打开方式介绍

    /*
     r   :读操作,文件指针指向文件头      (若不存在则打开失败)
     r+  :读、写操作,文件指针指向文件头      (若不存在则打开失败,若存在则清空文件)
     w   :写操作,文件指针指向文件头            (若不存在则新建,若存在则清空文件)
     w+  :读、写操作,文件指针指向文件头        (若不存在则新建,若存在则清空文件)
     a   :写操作, 文件指针指向文件结尾处     (若不存在则新建,若存在则不清空文件,此时读取不到文件内容)
     a+  :读、写操作,读指针指向文件开头,写指针指向文件结尾。 (若不存在则新建,若存在则不清空文件)
       ================ 加上b 则表示操作二进制文件 ===========
     */

2 文本文件写操作

int fprintFile(char* filePath) {
    FILE *fp = fopen(filePath, "a");
    if (NULL == fp) {
        fprintf(stdout, "[%s]open file %s NG\n", __FUNCTION__, filePath);
        return -1;
    }

    char tmpStr[1024];
    snprintf(tmpStr, sizeof(tmpStr), "%s\n", "123");
#if 1
    fprintf(fp, "%s", tmpStr); /*使用 fprintf 写入文件*/
#else
    if (EOF == fputs(tmpStr, fp)) { /*使用 fputs 写入文件*/
        fprintf(stdout, "fputs(tmpStr,fp) error\n");
    }
#endif
    fflush(fp); /*将缓存中的数据写入文件*/
    fclose(fp);
    return 0;
}


3 文本文件读操作

int fgetsFile(char* filePath) {
    FILE *fp = fopen(filePath, "a+");
    if (NULL == fp) {
        fprintf(stdout, "[%s]open file %s NG\n", __FUNCTION__, filePath);
        return -1;
    }

    /*逐行读取文件*/
    char lineData[1024];
    int lineNum = 1;
    while (1) {
        //读取一行数据,最后一个字符的换行符号'\n'
        if (fgets(lineData, sizeof(lineData), fp) == NULL) {
            break;
        }
        fprintf(stdout, "line%03d: %s", lineNum++, lineData);
    }
    fclose(fp);
    return 0;
}


4 二进制文件写操作

int fwriteFile(char* filePath) {
    FILE *fp = fopen(filePath, "wb+"); /*可读性,读从文件开头,写从文件结尾处*/
    if (NULL == fp) {
        fprintf(stdout, "[%s]open file %s NG\n", __FUNCTION__, filePath);
        return -1;
    }

    int tmpInt[6] ={0,1,2,3,4,5};
    fwrite(tmpInt,sizeof(int),sizeof(tmpInt)/sizeof(int),fp); /*int 写入文件*/
    printf("[%s] sizeof(tmpInt)=%d\n", __FUNCTION__, sizeof(tmpInt));
    char tmpStr[7]="012345";
    fwrite(tmpStr,sizeof(char),sizeof(tmpStr),fp); /* 字符串 写入文件*/
    fflush(fp); /*将缓存中的数据写入文件*/
    fclose(fp);
    return 0;
}

5 二进制文件读操作

struct tmpStru{
    int tmpInt[6];
    char tmpStr[7];
};
int freadFile(char* filePath) {
    FILE* fp = fopen(filePath, "rb"); //新建一个可写的文件
    if (NULL == fp) {
        printf("[%s]open file %s NG\n", __FUNCTION__, filePath);
        return -1;
    }

    // 逐个数据读入 
    int tmpInt[6];
    fread(tmpInt,sizeof(int),sizeof(tmpInt)/sizeof(int),fp);  /*使用 fread 写入文件*/
    printf("[%s] tmpInt[0]=%d\n", __FUNCTION__, tmpInt[0]);
    printf("[%s] tmpInt[5]=%d\n", __FUNCTION__, tmpInt[5]);
    char tmpStr[7];
    fread(tmpStr,sizeof(char),sizeof(tmpStr),fp); /*使用 fread 写入文件*/
    printf("[%s] tmpStr=%s\n", __FUNCTION__, tmpStr);

    // 一次性读入到结构体
    fseek(fp, 0, SEEK_SET); /*将文件指针指向开头*/
    tmpStru tmp;
    fread(&tmp,sizeof(char),sizeof(tmpStru),fp);  /*使用 fread 写入文件*/
    printf("[%s] tmpInt[0]=%d\n", __FUNCTION__, tmp.tmpInt[0]);
    printf("[%s] tmpInt[5]=%d\n", __FUNCTION__, tmp.tmpInt[5]);
    printf("[%s] tmpStr=%s\n", __FUNCTION__, tmp.tmpStr);

    fclose(fp);
    return 0;
}


6 利用管道读取xshell执行结果

int freadPopen(char *xshellcmd) {
    FILE *fp;
    // fp = popen( "ls -l", "r" ); //将“ls -l”命令的输出 通过管道读取(“r”参数)到FILE* stream
    fp = popen( "ping -c 10 10.34.114.223", "r" );
    // fp = popen(xshellcmd, "r");

    char buf[1024];
    int num = 1;
    while (1) {
        memset(buf, '\0', sizeof(buf));  //初始化buf,以免后面写入乱码到文件中
        // 从管道中读取xshell 命令的结果
#if 0
        // 若命令没有结束则fread会等待,直到可以读取到指定最大字符数
        size_t ret = fread(buf, sizeof(char), sizeof(buf), fp);
        if (ret < sizeof(buf)) {
            printf("\ntest end flag ret = %d\n", ret);
            break;
        }
#else
        /* 若命令没有结束则fgets会等待,逐行读取文件 */
        if (fgets(buf, sizeof(buf), fp) == NULL) {
            break;
        }
#endif
        printf("[%03d]%s",num++, buf);
    }
    fclose(fp);
    return 0;
}

 

posted @ 2018-08-23 13:53  Chris83  阅读(3560)  评论(0编辑  收藏  举报