DSP学习 -- Visual Studio 操作
如需轉載請注明出處 https://juyou.blog.csdn.net/article/details/107862686
最近一直使用Visual Studio寫代碼了,其中用到一些東西感覺有必要寫寫,不然過不了幾天就忘了。
先看看之前寫過的。
一、字符串函數
參看:C語言再學習 – 字符串和字符串函數
常用的字符串函數要知道:
1、用來統計字符串中有效字符的個數
size_t strlen (const char *s);
2、合并兩個字符串
char *strcat(char *dest, const char *src);
缺點:超出字符串存儲區范圍的話,有可能修改數組以外的存儲區這會導致嚴重錯誤
char *strncat(char *dest, const char *src, size_t n);
上面有提到strcat()函數的缺點,它并不能檢查第一個數組是否能夠容納第二個字符串。如果沒有為第一個數組分配足夠大的空間,多出來的字符溢出到相鄰存儲單元時就會出現問題。
3、比較兩個字符串的大小,比較依據的是ASCII碼
int strcmp(const char *s1, const char *s2);
返回值:依次比較字符串每一個字符的ASCII碼,如果兩個字符串參數相同,返回0;如果第一個字符串參數較大,則返回1,如果第二個字符串較大,則返回-1。
int strncmp(const char *s1, const char *s2, size_t n);
只比較兩個字符串里前n個字符
4、把一個字符串復制到另外一個字符數組里
char *strcpy(char *dest, const char *src);
缺點:有可能修改不屬于數組的存儲區,這會導致錯誤
char *strncpy(char *dest, const char *src, size_t n);
把一個字符串復制到另外一個字符數組里
5、在一個字符串中查找另外一個字符串所在位置
char *strstr(const char *haystack, const char *needle);
6、可以把字符數組中所有的字符存儲區填充同一個字符數據
void *memset(void *s, int c, size_t n);
這里要注意的是:
0 ‘0’ ‘\0’ “0” 的區別
7、按照格式把數據打印在字符數組中,形成一個字符串
int sprintf(char *str, const char *format, …);
這里需要知道的就是,printf、scanf占位符
參看:C語言再學習 – printf、scanf占位符
數據類型和占位符之間的對應關系
char和unsingned char %c
short %hd
unsigned short %hu
long %ld
unsigned long %lu
int %d
unsigned int %u
float %f/%g
double %lf/%lg
字符串 %s
使用十六進制數字0f的無符號十六進制整數 %x
使用十六進制數字0F的無符號十六進制整數 %X
%f和%lf會保留小數點后面多余的0 如 3.1400000 .2%f得 3.14
%g和%lg不會保留 如 3.14
%02d 兩位數,如果不夠前面補0, 如 02
8、從存儲區src 復制 n 個字符到存儲區dest。
void *memcpy(void *dest, const void *src, size_t n);
int i = 0; char str[12] = "01234"; memcpy(&i, &str[0], 4);strcpy 和 memcpy 主要有以下3方面的區別:
(1)復制的內容不同。strcpy 只能復制字符串,而memcpy可以復制任何內容,例如字符串數組、整型、結構體、類等。
(2)復制的方法不同。strcpy不需要指定長度,它遇到被復制字符串結束符’\0’才結束,所以容易溢出。memcpy則是根據其第3個參數決定復制的長度。
(3)用途不同。通常在復制字符串時用strcpy,而需要復制其他類型數據時則一般用memcpy。
9、字符串轉換函數
字符串轉換為整數 atoi
字符串轉換為長整數 atol
字符串轉換為浮點數 strtod
字符串轉換為長整數 strtol
字符串轉換為無符號長整型 strtoul
10、格式輸入
fscanf ()的工作方式和scanf()相似,區別在于前者需要第一個參數來指定合適的文件。
函數聲明:
int fscanf(FILE *stream, const char *format, …)
參數:
stream – 這是指向 FILE 對象的指針,該 FILE 對象標識了流。
format – 這是 C 字符串,包含了以下各項中的一個或多個:空格字符、非空格字符和format說明符。
返回值:
如果成功,該函數返回成功匹配和賦值的個數。如果到達文件末尾或發生讀錯誤,則返回 EOF。
二、預處理
參看:C語言再學習 – C 預處理器
1、#define 用法
2、#include 用法
3、#if #endif 用法
三、標準I/O
參看:UNIX再學習 – 標準I/O
參看:Stream I/O
1、打開流
參看:fopen, _wfopen
FILE *fopen(const char *path, const char *mode);
mode 方式:
2、讀和寫流 (文件輸入/輸出)
一旦打開了流,則可在 3 種不同類型的非格式化 I/O 中進行選擇,對其進行讀、寫操作。
(1)每次一個字符的 I/O。
一次讀或寫一個字符,如果流是帶緩沖的,則標準 I/O 函數 fgetc fputc處理所有緩沖。
(2)每次一行的 I/O。
如果想要一次讀或寫一行,則使用 fgets 和 fputs。每行都以一個換行符終止。當調用 fgets 時,應說明能處理的最大行長。
(3)直接 I/O。
fread 和 fwrite 函數支持這種類型的 I/O。每次 I/O 操作讀或寫某種數量的對象,而每個對象具有指定的長度。這兩個函數常用于從二進制文件中每次讀或寫一個結構。
3、定位流
int fseek(FILE *stream, long offset, int fromwhere);
重定位流(數據流/文件)上的文件內部位置指針
注意:文件指針指向文件/流。位置指針指向文件內部的字節位置,隨著文件的讀取會移動,文件指針如果不重新賦值將不會改變或指向別的文件。
函數設置文件指針stream的位置。如果執行成功,stream將指向以fromwhere(偏移起始位置:文件頭0(SEEK_SET),當前位置1(SEEK_CUR),文件尾2(SEEK_END))為基準,偏移offset(指針偏移量)個字節的位置。如果執行失敗(比如offset超過文件自身大小),則不改變stream指向的位置。
四、文件夾操作
查看 tchar.h
1、_findfirst(), _findnext(), _findclose() 查看路徑下文件夾和文件
參看:Filename Search Functions
讀取文件可以采用幾個函數分別為,_findfirst、_findnext、_findclose。其中還要借助結構體 struct _finddata_t,_finddata_t主要用來存儲各種文件的信息。
struct _finddata64i32_t {unsigned attrib;__time64_t time_create; /* -1 for FAT file systems */__time64_t time_access; /* -1 for FAT file systems */__time64_t time_write;_fsize_t size;char name[260];結構:
unsigned attrib
文件屬性。
time_t time_create
文件創建時間(對于FAT文件系統,為-1L)。此時間以UTC格式存儲。要轉換為當地時間,請使用 localtime_s。
time_t time_access
上次文件訪問的時間(對于FAT文件系統,該時間為-1L)。此時間以UTC格式存儲。要轉換為當地時間,請使用 localtime_s。
time_t time_write
上次寫入文件的時間。此時間以UTC格式存儲。要轉換為當地時間,請使用 localtime_s。
_fsize_t size
文件長度,以字節為單位。
char name[ _MAX_PATH]
匹配文件或目錄的名稱,以null終止,不帶路徑。
您不能指定目標屬性(例如_A_RDONLY)來限制查找操作。這些屬性attrib在_finddata_t結構的字段中返回,并且可以具有以下值(在IO.h中定義)。用戶不應依賴這些作為該attrib字段可能的唯一值。
其中文件的屬性,分別有以下幾種:
_A_ARCH
存檔。每當通過BACKUP命令更改和清除文件時設置。值:0x20。
_A_HIDDEN
隱藏文件。除非使用/ AH選項,否則通常不會在DIR命令中看到。返回有關普通文件和具有此屬性的文件的信息。值:0x02。
_A_NORMAL
正常。文件沒有設置其他屬性,可以不受限制地讀取或寫入文件。值:0x00。
_A_RDONLY
只讀。無法打開文件進行寫入,也無法創建具有相同名稱的文件。值:0x01。
_A_SUBDIR
子目錄。值:0x10。
_A_SYSTEM
系統文件。除非使用/ A或/ A:S選項,否則通常在DIR命令中看不到。值:0x04。
示例:
使用do while循環可還行。
void getAllFiles(const string& path, vector<string>& files) {//文件句柄intptr_t hFile = 0;//intptr_t:x86編譯時int,X64時long long//文件信息struct _finddata_t fileinfo; //文件信息讀取結構string p; //string一個賦值函數:assign(str):把str拷貝給p,append(str):在字符串結尾追加strif ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)//"*"為通配符,匹配所有字符串 {do {if ((fileinfo.attrib & _A_SUBDIR)) { //比較文件類型是否是文件夾if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) {files.push_back(p.assign(path).append("\\").append(fileinfo.name));//子文件夾路徑getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files);//查找子文件夾下的所有文件信息}}else {files.push_back(p.assign(path).append("\\").append(fileinfo.name));//文件路徑}} while (_findnext(hFile, &fileinfo) == 0); //尋找下一個,成功返回0,否則-1_findclose(hFile);} }2、文件夾操作
創建文件夾: _mkdir()
參看:_mkdir, _wmkdir
該_mkdir函數創建一個具有指定一個新的目錄目錄名。 _mkdir每次調用只能創建一個新目錄,因此只有dirname的最后一個組件才能命名新目錄。_mkdir不轉換路徑定界符。在Windows NT中,反斜杠(\)和正斜杠(/)都是運行時例程中字符串中的有效路徑定界符。
// crt_makedir.c#include <direct.h> #include <stdlib.h> #include <stdio.h>int main( void ) {if( _mkdir( "\\testtmp" ) == 0 ){printf( "Directory '\\testtmp' was successfully created\n" );system( "dir \\testtmp" );if( _rmdir( "\\testtmp" ) == 0 )printf( "Directory '\\testtmp' was successfully removed\n" );elseprintf( "Problem removing directory '\\testtmp'\n" );}elseprintf( "Problem creating directory '\\testtmp'\n" ); }刪除文件夾: _rmdir()
_rmdir, _wrmdir
該_rmdir函數刪除指定的目錄目錄名。該目錄必須為空,并且不能為當前工作目錄或根目錄。
那么問題來了,如果刪除非空文件夾,該怎么辦呢?
使用:
system(“rd /s/q 對應的路徑”);
/s 除目錄本身外,還講刪除指定目錄下的所有子目錄和文件。
/q 安靜模式,帶/s刪除目錄樹時不需要確認。
進入文件夾: _chdir()
參看:_chdir, _wchdir
_chdir功能改變當前的工作目錄由指定的目錄目錄名。該目錄名稱參數必須指向現有的目錄。此功能可以更改任何驅動器上的當前工作目錄。如果在dirname中指定了新的驅動器號,則默認驅動器號也會更改。例如,如果A是默認驅動器號,\ BIN是當前工作目錄,則以下調用更改驅動器C的當前工作目錄,并將C建立為新的默認驅動器:
_chdir("c:\temp");在路徑中使用可選的反斜杠字符(\)時,必須在C字符串文字中放置兩個反斜杠(\)以表示單個反斜杠(\)。
// crt_chdir.c // arguments: C:\WINDOWS/* This program uses the _chdir function to verifythat a given directory exists. */#include <direct.h> #include <stdio.h> #include <stdlib.h> #include <errno.h>int main( int argc, char *argv[] ) {if(_chdir( argv[1] ) ){switch (errno){case ENOENT:printf( "Unable to locate the directory: %s\n", argv[1] );break;case EINVAL:printf( "Invalid buffer.\n");break;default:printf( "Unknown error.\n");}}elsesystem( "dir *.exe"); }文件夾是否存在: _access();
參看:_access, _waccess
頭文件:<io.h>
函數原型:int _access(const char *pathname, int mode);
參數:pathname 為文件路徑或目錄路徑 mode 為訪問權限(在不同系統中可能用不能的宏定義重新定義)
返回值:如果文件具有指定的訪問權限,則函數返回0;如果文件不存在或者不能訪問指定的權限,則返回-1.
備注:當pathname為文件時,_access函數判斷文件是否存在,并判斷文件是否可以用mode值指定的模式進行訪問。當pathname為目錄時,_access只判斷指定目錄是否存在,在Windows NT和Windows 2000中,所有的目錄都只有讀寫權限。
mode的值和含義如下所示:
00——只檢查文件是否存在
02——寫權限
04——讀權限
06——讀寫權限
3、system 執行命令
參看:system, _wsystem
所述系統功能通過命令到命令解釋器,它執行字符串作為操作系統命令。系統使用COMSPEC和PATH環境變量來定位命令解釋器文件CMD.exe。如果command為NULL,則該函數僅檢查命令解釋器是否存在。
您必須使用fflush或_flushall顯式刷新,或在調用system之前關閉任何流。
示例:
使用system對文本文件進行TYPE。
上面用到了兩個指令:
system("rd /s/q 對應的路徑"); system( "type crt_system.txt" );這些都是DOS指令,查看 help
C:\Users\Administrator>help 有關某個命令的詳細信息,請鍵入 HELP 命令名 ASSOC 顯示或修改文件擴展名關聯。 ATTRIB 顯示或更改文件屬性。 BREAK 設置或清除擴展式 CTRL+C 檢查。 BCDEDIT 設置啟動數據庫中的屬性以控制啟動加載。 CACLS 顯示或修改文件的訪問控制列表(ACL)。 CALL 從另一個批處理程序調用這一個。 CD 顯示當前目錄的名稱或將其更改。 CHCP 顯示或設置活動代碼頁數。 CHDIR 顯示當前目錄的名稱或將其更改。 CHKDSK 檢查磁盤并顯示狀態報告。 CHKNTFS 顯示或修改啟動時間磁盤檢查。 CLS 清除屏幕。 CMD 打開另一個 Windows 命令解釋程序窗口。 COLOR 設置默認控制臺前景和背景顏色。 COMP 比較兩個或兩套文件的內容。 COMPACT 顯示或更改 NTFS 分區上文件的壓縮。 CONVERT 將 FAT 卷轉換成 NTFS。你不能轉換當前驅動器。 COPY 將至少一個文件復制到另一個位置。 DATE 顯示或設置日期。 DEL 刪除至少一個文件。 DIR 顯示一個目錄中的文件和子目錄。 DISKPART 顯示或配置磁盤分區屬性。 DOSKEY 編輯命令行、撤回 Windows 命令并創建宏。 DRIVERQUERY 顯示當前設備驅動程序狀態和屬性。 ECHO 顯示消息,或將命令回顯打開或關閉。 ENDLOCAL 結束批文件中環境更改的本地化。 ERASE 刪除一個或多個文件。 EXIT 退出 CMD.EXE 程序(命令解釋程序)。 FC 比較兩個文件或兩個文件集并顯示它們之間的不同。 FIND 在一個或多個文件中搜索一個文本字符串。 FINDSTR 在多個文件中搜索字符串。 FOR 為一組文件中的每個文件運行一個指定的命令。 FORMAT 格式化磁盤,以便用于 Windows。 FSUTIL 顯示或配置文件系統屬性。 FTYPE 顯示或修改在文件擴展名關聯中使用的文件類型。 GOTO 將 Windows 命令解釋程序定向到批處理程序中某個帶標簽的行。 GPRESULT 顯示計算機或用戶的組策略信息。 GRAFTABL 使 Windows 在圖形模式下顯示擴展字符集。 HELP 提供 Windows 命令的幫助信息。 ICACLS 顯示、修改、備份或還原文件和目錄的 ACL。 IF 在批處理程序中執行有條件的處理操作。 LABEL 創建、更改或刪除磁盤的卷標。 MD 創建一個目錄。 MKDIR 創建一個目錄。 MKLINK 創建符號鏈接和硬鏈接 MODE 配置系統設備。 MORE 逐屏顯示輸出。 MOVE 將一個或多個文件從一個目錄移動到另一個目錄。 OPENFILES 顯示遠程用戶為了文件共享而打開的文件。 PATH 為可執行文件顯示或設置搜索路徑。 PAUSE 暫停批處理文件的處理并顯示消息。 POPD 還原通過 PUSHD 保存的當前目錄的上一個值。 PRINT 打印一個文本文件。 PROMPT 更改 Windows 命令提示。 PUSHD 保存當前目錄,然后對其進行更改。 RD 刪除目錄。 RECOVER 從損壞的或有缺陷的磁盤中恢復可讀信息。 REM 記錄批處理文件或 CONFIG.SYS 中的注釋(批注)。 REN 重命名文件。 RENAME 重命名文件。 REPLACE 替換文件。 RMDIR 刪除目錄。 ROBOCOPY 復制文件和目錄樹的高級實用工具 SET 顯示、設置或刪除 Windows 環境變量。 SETLOCAL 開始本地化批處理文件中的環境更改。 SC 顯示或配置服務(后臺進程)。 SCHTASKS 安排在一臺計算機上運行命令和程序。 SHIFT 調整批處理文件中可替換參數的位置。 SHUTDOWN 允許通過本地或遠程方式正確關閉計算機。 SORT 對輸入排序。 START 啟動單獨的窗口以運行指定的程序或命令。 SUBST 將路徑與驅動器號關聯。 SYSTEMINFO 顯示計算機的特定屬性和配置。 TASKLIST 顯示包括服務在內的所有當前運行的任務。 TASKKILL 中止或停止正在運行的進程或應用程序。 TIME 顯示或設置系統時間。 TITLE 設置 CMD.EXE 會話的窗口標題。 TREE 以圖形方式顯示驅動程序或路徑的目錄結構。 TYPE 顯示文本文件的內容。 VER 顯示 Windows 的版本。 VERIFY 告訴 Windows 是否進行驗證,以確保文件正確寫入磁盤。 VOL 顯示磁盤卷標和序列號。 XCOPY 復制文件和目錄樹。 WMIC 在交互式命令 shell 中顯示 WMI 信息。有關工具的詳細信息,請參閱聯機幫助中的命令行參考。如果還想繼續查看命令詳細信息: help + 命令
C:\Users\Administrator>help RD 刪除一個目錄。RMDIR [/S] [/Q] [drive:]path RD [/S] [/Q] [drive:]path/S 除目錄本身外,還將刪除指定目錄下的所有子目錄和文件。用于刪除目錄樹。/Q 安靜模式,帶 /S 刪除目錄樹時不要求確認五、freopen
參看:UNIX再學習 – 標準I/O
將printf 內容保存到abc.txt
//示例二 freopen 函數 #include<stdio.h> #include <stdlib.h>int main (void) { FILE*fp = NULL; fp = freopen("abc.txt", "w", stdout); if(NULL == fp) perror("fail to freopen"), exit (1); printf ("hello world!\n");fclose (stdout);fclose (fp); fp = NULL; return 0; } 查看 abc.txt # cat abc.txt hello world!六、編譯生成的應用以管理員身份運行
屬性->鏈接器->清單文件->UAC執行級別
選擇 requireAdministrator (/level=‘requireAdministrator’)
如需轉載請注明出處 https://juyou.blog.csdn.net/article/details/107862686
總結
以上是生活随笔為你收集整理的DSP学习 -- Visual Studio 操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试中千万不要出现这些行为,很减分!
- 下一篇: DSP学习 -- cJSON使用教程