文件(文本、二进制)读写,利用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; }