Linux環境C語言把整數轉換成字符串再保存該字符串數據爲文本

一、前言

  1. 剛步入社會工作,只是想把自己做的事情做一個記錄,同時也可以分享給網友,雖然都是些基礎,但領導說得很對,細節非常重要;
  2. 本測試程序非常簡單,對本人來說,意義在於讀取電池放電的採樣數據,然後把得到的離散數據用excel繪製成一條放電曲線,找到電池滿電以及空點的臨界點,最後應用到應用層的電池充放電的圖標繪製;

二、代碼說明

1. 打開要保存文件的方式

linux環境支持的文件打開的幾種方式,可以用man fopen進行查看,如下:
這裏寫圖片描述

跟我在以前譚浩強C語言課本中看到的有點不一樣,還有b選項,我採用的是“a+”模式,當文件關閉後,可以繼續追加寫;
fp = fopen("/usr/value_ad.txt","a+");

2. 整數轉換字符串再存取

開始準備fwrite()進行寫操作的,後來發現還是把整數轉換成字符串存入文件更方便,經查閱資料發現,非linux環境下的整數轉換字符串除了支持 sprintf()函數外,還支持itoa()函數,在此針對linux環境就只採用sprintf()函數;
通過fputs()函數進行寫,需添加頭文件#include

sprintf(str,"%d",data);
fputs(str,fp);

3. linux環境與windows環境的換行格式的差別

在每次寫一個字符竄數據之後,都要寫一個換行符,如果採用如下代碼:

fputs("\n",fp)

在linux打開保存的文件如下:
這裏寫圖片描述
但在windows下面打開該文件的數據排版如下:
這裏寫圖片描述
解決該問題的方法如下:
利用“\r\n”替換“\n”,即

fputs("\r\n",fp)

源碼及測試

以下源碼爲我單獨編寫的,思路都是一樣,數據來源不一樣而已;

#include <stdio.h>
#include <stdlib.h>

#define READ_DATA_COUNT 20
#define OPEN_FILE_COUNT 5

int main(int argc,char **argv){
    int data = 222;//模擬讀取的數據
    int count = 0;//記錄所讀取數據的次數,再進行存取操作
    int saveData_perOpen = 0;//每次打開設備文件所要所存數據的數量
    char str[25];

    FILE *fp;
         if((fp = fopen("/usr/value_ad.txt","a+")) == NULL)//打開設備文件
         {
                 printf("cannot open this file\n");
                 return 0;
         }
  //如果自己測試就把while(1)改成有限循環來執行;      
    while(1){//因爲要測試電池的AD值,並不知道循環具體的終止條件,那麼就讓嵌入式設備自動關機來結束
        data++;
        count++;
                if(count%READ_DATA_COUNT == 0){//因爲採樣的數據頻率快,我選擇每讀取20個數據存一次
                        printf("%d\n", data);
                        sprintf(str,"%d",data);//整數轉換字符串
                        if(fputs(str,fp) == '\0')//寫字符串
                        {
                                printf("cannot open file\n");
                                return 0;
                        }
                        fputs("\r\n",fp);//寫換行符
                        count = 0;
                        saveData_perOpen++;
                        if (saveData_perOpen == OPEN_FILE_COUNT)//如果不採用這個if,估計設備關機是不會執行fclose()函數的(我直接用ctrl+c終止後臺測試的),數據就不能保存成功,所以採用一種比較笨的方法,每存5個數時關閉文件再打開,還可以fflush()函數刷新;
                        {
                                fclose(fp);//關閉設備文件
                                if((fp = fopen("/usr/value_ad.txt","a+")) == NULL)//重新打開設備文件
                                {
                                        printf("cannot open this file\n");
                                        return 0;
                                }
                                saveData_perOpen = 0;
                        }
                }
    }
    fclose(fp);//關閉設備文件
    return 0;
}

在採集的2萬多個數據中,存取了1500個左右的數據,然後用所得的數據繪製成一張電池的放電曲線,如下圖:
這裏寫圖片描述
這裏寫圖片描述
開始的數據可能是接了外接電源的緣故,AD值會大一些,但不會影響整個曲線趨勢的大體走向。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章