2017年7月7日 星期五

[ C / C++] 讀取任意目錄的 檔案名稱、路徑、濾特定副檔名

[ C / C++] 讀取任意目錄的 檔案名稱、路徑、濾特定副檔名

存取任意位置的目錄 - 第一版

這個可以讀取任意目錄位置下的所有檔案與目錄

  • 第一版是不能讀子目錄的,需要讀子目錄請繼續往下看
  • 如果需要過濾特定檔案,比如說圖片 *.jpg *.bmp 之類的
    改一下 extenName 擴展名的部分 *.jpg 就可以了
/*****************************************************************
Name : ReadFiles path
Date : 2017/05/22
By   : CharlotteHonG
Final: 2018/03/08
*****************************************************************/

#include <stdio.h>
#include <string.h>
#include <io.h>
#include <direct.h>

void getDirFile(const char* definePath, const char* extenName){
    char buff[1024];
    _chdir(definePath);
    unsigned long long hFile;
    struct _finddata_t fileName;
    hFile = _findfirst(extenName, &fileName);
    do {
        sprintf(buff, "%sprintf\\%s", definePath, fileName.name);
        printf("%s\n", buff);
    } while(hFile != -1 && _findnext(hFile, &fileName)==0);
}

int main(int argc, char const *argv[]){
    // 設置目錄與檔案類型
    const char* definePath = "C:\\";
    const char* extenName = "*.*";
    // 獲取目錄
    getDirFile(definePath, extenName);
    return 0;
}

第二版

原本第一版是不能讀取子目錄的,寫好第二版可以正常讀取了。

/*****************************************************************
Name : ReadFiles path
Date : 2017/05/22
By   : CharlotteHonG
Final: 2021/04/20
*****************************************************************/
#include <stdio.h>
#include <string.h>
#include <io.h>

void getFileList(const char* _dirPath, const char* extenName){
    struct _finddata_t file;
    intptr_t hFile;
    // 修正路徑
    char dirPath[256] = {0};
    if (_dirPath[strlen(_dirPath)-1]!='\\')
        sprintf(dirPath, "%s\\", _dirPath);
    else
        sprintf(dirPath, "%s", _dirPath);
    // 檢查路徑是否有效
    char buff[256] = {0};
    sprintf(buff, "%s%s", dirPath, extenName);
    if ((hFile = _findfirst(buff, &file)) == -1)
        perror("path error"), exit(1);
    int i=0;
    // 開始搜索
    do {
        // 避開當前目錄[.]和上一層目錄[..]
        if (!(strcmp(file.name, ".")) || !(strcmp(file.name, "..")))
            continue;
        // 子目錄
        if (file.attrib == _A_SUBDIR) {
            sprintf(buff, "%s%s", dirPath, file.name);
            getFileList(buff, extenName);
            // 檔案
        } else {
            sprintf(buff, "%s%s", dirPath, file.name);
            printf("%s\n", buff);
        }
    } while (_findnext(hFile, &file)==0);
}

int main(int argc, char const* argv[]) {
    const char* dirPath="Z:\\a";
    const char* extenName="*.*";
    getFileList(dirPath, extenName);
    return 0;
}

如果需要把檔名封裝到物件上,可以參考這一份檔案,是純C寫的。
https://gist.github.com/hunandy14/24a5e7690a18e6d3cf320e68d8ccc7fd




簡易的存取 main.c 當下的目錄文件

第二種方式是透過系統本身的命令列 dir 來讀取。

關於這個解決方案有更好的版本寫在這篇站內文
https://charlottehong.blogspot.com/2021/04/c-c.html

C++

/*****************************************************************
Name : ReadFiles path
Date : 2017/05/22
By   : CharlotteHonG
Final: 2017/05/24
*****************************************************************/
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char const *argv[]){
    system("dir /b /on >list.txt");
    fstream f("list.txt", ios::in);
    for(string s;f >> s;) {
        cout << s << endl;
    }
    return 0;
}

C語言

/*****************************************************************
Name : ReadFiles path
Date : 2017/05/22
By   : CharlotteHonG
Final: 2017/05/24
****************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[]){
    system("dir /b /on > list.txt");
    FILE *pFile = fopen("list.txt","r");
    for(char buf[128]; fgets(buf, 128, pFile) != NULL;){
        if(buf[strlen(buf)-1]='\n')
            buf[strlen(buf)-1] = '\0';
        printf("%s\n", buf);
    }
    return 0;
}

2017年7月5日 星期三

O Bike 騎乘體驗與收費說明 大學生無信用卡也可以

O Bike 騎乘體驗與開通教學 大學生無信用卡也可以

圖片擷取自官方網站

註冊帳戶

註冊優惠連結:https://goo.gl/FZWb6H
點擊後輸入手機即可以完成註冊會員
記得輸入的時候手機號碼要去掉首號的 0

下載APP

官方連結:https://www.o.bike/tw/download.html
下載後登入帳戶即可使用
第一次登入時需綁定信用卡並支付 $900 訂金,這個訂金是可以退回的,並且在限定次數內是不會扣手續費的,你可以拿到完整的 $900。
可以使用郵局簽帳卡須開通非過卡交易與國外交易,支付是屬於國外支付。
如果你還是學生沒有信用卡可以使用,可以去開通郵局的辦一張金融卡,記得開通上述功能,或買個讀卡機線上開通。
這個可能比較簡單快速,帶著存摺印章去辦就好了
或者這裡介紹一家可以很快拿到簽帳金融卡的銀行
王道銀行:官方連結
註冊過程需要拍身分證與健保卡,可以使用手機拍攝。過程很簡單,不含假日註冊完畢我那時候大概3天就拿到簽帳卡了。
除此之外需要跑一趟戶政事務所,辦理自然人憑證,這手續很快大概5分鐘就搞定了。
以及需要購買一台讀卡機,之後開卡會用到。
拿到簽帳卡之後就是一張可以線上刷卡的金融卡了,第一次使用須從APP開通
王道銀行APP:https://goo.gl/iHtse0
開通過程只是打開App輸入帳密點一下開通這樣而已。
除此之外還需要使用自然人憑證登入王道銀行網路銀行
王道銀行網路銀行:https://goo.gl/hux9tD
左邊個人設定->帳戶升級,也是點一點而已
然後把錢存進去就可以刷卡了~

腳踏車

進入APP首頁之後會有地圖,地圖上可以明顯地看到腳踏車位置,如果沒有看到腳踏車有可能是你的位置附近沒有,試著把地圖移動到熱鬧的地區就可以看見了。
程序中很明顯有一個掃馬開鎖,找到腳踏車掃馬就可以騎走了。
記得開藍芽,並且不要關閉
腳踏車長這個樣子。
會有兩個地方可以掃馬車頭與車尾
對著他們掃描,開鎖需要一點時間大概10秒左右
第一天免費,隨便你騎

停車

這裡官方上是說找腳踏車專用停車格停,不過實際上他們公司補車的時候更多的時候是直接把新車放在機車停車格上的。
再來,等你實際騎乘之後APP上其實會貼心地告訴你,只要停在非紅線處且不干擾到別人的地方即可。
亂停會被扣信用分數,不過我猜這裏扣分應該是你太誇張那台車子被檢舉,公司不得不出人來把車子回收才扣分的,應該不至於是GPS定位扣分,可以放心停概率不是太高。
然後大家比較有疑慮的可能是,如果我要去吃飯之類的暫時性的停一下子等等還要騎乘可以鎖車嗎?
這裡他的機能是一但鎖定之後就結束騎乘了,不會繼續收費,要卡位的話鎖定之後到APP點擊你的那台車子可以按預約,可以卡位10分鐘。
鎖定的時候記得手機要開藍芽要等一下,也是差不多時間手機畫面會出現騎乘結束,這樣才能安心離開。
建議騎乘時藍芽不要關,不會太耗電,騎完在關就好了。

C++ 如何辨識代碼是在 gcc 上面跑還是 vc 上跑

C++ 如何辨識代碼是在 gcc 上面跑還是 vc 上跑

有些時候我們會需要能夠識別到底是在 gcc 上還是 visual Studio 上跑,畢竟兩者之間相容性還是有很大區別的,可以利用 Macro 來偵測。
如以下範例,把代碼打在裡面就自然會在正確的編譯器上運行了。
#if defined(_MSC_VER) 
   /* VC */
#endif

#if defined(__GNUC__)
   /* gcc */
#endif

2017年7月4日 星期二

從零開始使用 STM32 F469I 燒錄測試程式

從零開始使用 STM32 F469I 燒錄測試程式

大多數的時候我發現其實真正不能起手的是不知道怎麼燒錄!不知道為什麼網路上大多都只教學如何改代碼代碼是什麼意思,如果今天給你一塊板子你該怎麼辦?
這篇文章主要就是介紹如何從零開始,你手上只有板子你什麼都沒有怎麼辦?

預裝軟體

  1. MDK523.EXE (Keil uVision5)
    可以從官方下載免費版的,可以用只是會限制上傳大小
  2. ST-Link
    可以從板子上的網址連過去下載
  3. Keil.STM32F4xx_DFP.2.9.0
    可以直接從uVision5內更新或下載
  4. 範例代碼
    可以從板子上的網址連過去下載

uVision5

到官方下載,可以直接用,免費版本有限制。
官方網址:http://www2.keil.com/mdk5/
幫你點好了懶人包:http://www2.keil.com/mdk5/install

板子上會有一個網址,連過去可以下載,大概會長這個樣子

幫你打上來大概F4系列都是同一個
網址:http://www.st.com/stm32f4-discovery

接下來找到你自己的型號,以這邊範例是這個

拉到最下面這裡只是版本差異都可以

下載,不過會要你填一些資訊,之後會把載點寄到信箱,記得不要亂填

載好之後直接安裝,看你電腦幾位元的就安裝什麼

Keil.STM32F4xx_DFP

這個是keil裡面的套件,可以直接線上更新,記得要連網不然會看不到。
需要什麼就選什麼裝就好,還蠻大的要花不少時間慢跑
到這邊環境已經架設好可以跑瞜~
手動下載離線包可以到下面連結找到相對應的板子型號,一樣在上方的畫面左上角 File 點進去之後按加入,可以不用解開壓縮檔直接按加入。
http://www.keil.com/dd2/pack/

範例代碼

在剛剛 ST-Link 下載的網址
這裡整個F4系列的都共用的,都包含進去了
解壓縮之後開啟這個位置
STM32Cube_FW_F4_V1.16.0\Projects\STM32469I-Discovery\Examples
粗體型號必須選自己的板子,這個型號盒子上有寫,有些型號版本有細微的差異,板子本身沒有打印。
這裡進來就是各項使用的範例,我們使用最簡單的GPIO當測試,可以從板子上內建的按鈕與LED燈測試燒錄成功。
進來之後選擇 GPIO\GPIO_EXTI\MDK-ARM MDK-ARM是寫給我們剛剛安裝的軟體用的範例代碼。

執行

開啟剛剛的GPIO測試
接下來先按編譯,這裡第一次要按全部編譯,會比較久,第二次如過只動一份檔案可以按他左邊的只重新編譯當前文件,這樣比較省時間。
編譯完畢之後執行,執行要手動跑一下程序左邊四個自己選,跑完結束的地方像圖中那樣,接下來按一下板子藍色的按鈕,翻到正面看LED會跟著你按的時候做出變化。
如果想直接讓他跑到底直接看結束,可以翻板子後面reset按一下就會自動跑完了,不過跑完就不能重來了,要除錯再按 ctrl+f5 重跑一次就好了。

參考

2017年6月23日 星期五

筆電安裝 SSD (M2) 之後如何選擇以 SSD (M2)開機

筆電安裝 SSD (M2) 之後如何選擇以 SSD (M2)開機

記得新硬碟預設都是MBR要改成GUID才可以正常使用,改變的方式直接在windows內修改即可。
另外請不要做4K對齊,大多數的網站都說要但那其實沒必要,只要使用windwos的光碟或USB把分割區砍光在重新切割(會切好幾份正常的)就已經對齊;真正需要對齊的是XP,XP的安裝光碟不會幫你對齊,必須手動執行對齊。
還有一堆優化SSD的手續呀~千萬不要,現在都2017了~請相信微軟是一家有能力的公司,放心交給他都已經幫你做好了。不過如果你是在XP還是有必要要自己做。

選擇硬碟

如果不想移除舊系統可以留著,有個兩個方式可以選擇使用M2開機,一種是硬碟拆了只留SSD它會自動幫你選到SSD開機,在接上原本的硬碟。
如果需要臨時開到別的硬碟,去BIOS開啟F12選單,可以選硬碟
另一種是你不能拆,然後又偏偏他是開你的HDD那你只好自己建立開機選單了,建立方式也不難,進去BIOS先設定密碼(這是必要的才能啟用功能),然後再設定密碼那裏就有一個瀏覽EFI開機檔,檔案並不多你就瀏覽一下很容易可以找到的,忘了拍照。

使用MBR硬碟

很多網站建議應該使用MBR,千萬不要這會造成不少後果…
已知可能造成關機會黑屏然後電源沒切,解決方式是去電源關閉快速啟動。這個舉動會大大減緩開機速度,沒辦法使用混合開機。
已經裝了沒事就好了,開機慢一點還是可以用。

2017年6月21日 星期三

[圖文] OpenCV 3.4.1 安裝配置在 Visual Studio 2017

[圖文] OpenCV 3.4.1 安裝配置在 Visual Studio 2017


1. 新版的 Visual Studio 2022 + OpenCV490 可以參考新文章https://charlottehong.blogspot.com/2024/02/opencv-490-win11-visual-studio-2022.html







2. Visual Studio 2019 + OpenCV401 可以參考新文章
https://charlottehong.blogspot.com/2019/02/opencv-401-visual-studio-2019.html

正文開始

先到官方下載這兩項軟體 (點擊有連結)
關於 Visual Studio 2017 如何安裝可以參考 https://charlottehong.blogspot.com/2018/09/c-visual-studio-2017.html
建議直接解壓縮到C槽,本文範例即直接解壓縮到C


文件說明

build文件是官方已經幫你預先編譯好的檔案,開進去
C:\opencv\build\x64\vc15\bin
可以看到vc15 的字樣,這是給 visual studio 2017 用的。
總而言之會用到的只有
  • C:\opencv\build\include
  • C:\opencv\build\x64\vc15


部屬 OpenCV

首先只要做一次就好的是
  • 系統環境變數加入 bin 路徑
編譯器大概需要三個步驟(每次第一次開新專案)
  • 編譯器加入 include 路徑
  • 編譯器加入 lib 路徑
  • 編譯器加入 lib 檔案

環境變數(說明文字在圖下)

搜索一下你的電腦環境變數或系統內容都可以(也可以直接對著本機按右鍵內容)
(點擊放大)位置是:C:\opencv\build\x64\vc15\bin
如果在設定環境變數之前就已經先打開 Visual Studio 的話,需要重新啟動 Visual Studio ,沒有重開編譯的時候會出現 “找不到**.dll檔案”
標記一下蠻常出現的錯誤
LNK1104 無法開啟檔案 'opencv_worldXXXd.lib'
這個是環境變數這個步驟做錯了

設定編譯器

打開新專案
選擇傳統式精靈,專案名稱就隨意打一個不影響
打勾空白專案,(這裡其實可選,文章為方便撰寫使用空白專案)
再來對著專案按右鍵新增檔案
可以改名字,這邊我就直接按新增了
再來要進入設定裡面設置,留意一下紫色的框框待會會用到
截圖截錯了,以下 紫色框框要選 x64 模式  (OpenCV 提供的預編檔案只有x64)
截圖截錯了,以下 紫色框框要選 x64 模式  (OpenCV 提供的預編檔案只有x64)
進來之後對照一下紫色框框,兩個要一樣才有用(總共會有4種組合)
貼上include的路徑:C:\opencv\build\include
這裡貼上 lib 的路徑:C:\opencv\build\x64\vc15\lib
一樣留意一下紫色的框框
這裡需要指定引入那些 *.lib 檔案
我們進來opencv的文件裡面看
根據你的模式設定(留意紫色框框)
好了之後貼上測試代碼
/**********************************************************
Name :
Date : 2016/05/29
By   : CharlotteHonG
Final: 2016/05/29
**********************************************************/
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char const *argv[]) {
    /* 畫布 */
    Mat img(270, 720, CV_8UC3, Scalar(56, 50, 38));
    /* 直線 */
    line(img, Point(20, 40), Point(120, 140), Scalar(255, 0, 0), 3);
    /* 實心方塊 */
    rectangle(img, Point(150, 40), Point(250, 140), Scalar(0, 0, 255), -1);
    /* 實心圓 */
    circle(img, Point(330, 90), 50, Scalar(0, 255, 0), -1);
    /* 空心橢圓 */
    ellipse(img, Point(460, 90), Size(60, 40), 45, 0, 360, Scalar(255, 255, 0), 2);
    /* 不規則圖形 */
    Point points[1][5];
    int x = 40, y = 540;
    points[0][0] = Point(0 + y, 50 + x);
    points[0][1] = Point(40 + y, 0 + x);
    points[0][2] = Point(110 + y, 35 + x);
    points[0][3] = Point(74 + y, 76 + x);
    points[0][4] = Point(28 + y, 96 + x);
    const Point* ppt[1] = { points[0] };
    int npt[] = { 5 };
    polylines(img, ppt, npt, 1, 1, Scalar(0, 255, 255), 3);
    /* 繪出文字 */
    putText(img, "Test Passed !!", Point(10, 230), 0, 3, Scalar(255, 170, 130), 3);
    /* 開啟畫布 */
    namedWindow("OpenCV Test By:Charlotte.HonG", WINDOW_AUTOSIZE);
    imshow("OpenCV Test By:Charlotte.HonG", img);
    waitKey(0);
    return 0;
}
留意一下紫色框框是不是跟你剛剛設定的一樣 (這邊我已經發現錯了改回x64)
如果做到這邊才發現跟我一樣選錯了,要退回去include路徑那步重作
設定裡面 x86->x64 改了全部會歸零…

運行

設定好之後直接按F5運行吧~~
出現找不到 dll 檔案,重新啟動一下 Visual Studio 2017 。


其他

如果需要完整的OpenCV功能,比如說 SIFT 等這些實作需要自己重新編譯,重新編譯可以參考這篇站內文,手動編譯原始檔的方法。
http://charlottehong.blogspot.com/2017/07/opencv-320-contrib-visual-studio.html