為什麼這篇Fopen string鄉民發文收入到精華區:因為在Fopen string這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者loveme00835 (高髮箍)看板C_and_CPP標題Re: [問題] fopen() &...
※ 引述《changyuheng (張昱珩)》之銘言:
: ※ 引述《KSmart (經濟不景氣,好景不常在)》之銘言:
: : 1.fopen的問題
: : 如果我新增的檔案名稱是一個變數(可能是日期或是身分證字號),
: : 因為會隨著每一天增加一個檔案,如果我用以下的方式寫則會出現Error..
: : 請問fopen要如何使用在動態的檔案名稱上呢??
: : string strdate="20121012";
: : FILE* fw=fopen("..\\Temp\\"+strdate,"wb");
: fopen 是 c 的 function,string 是 c++ 的
: char name[MAX_PATH] = 0;
^這裡怎麼能編過的我很好奇
: sprintf(name, "..\\Temp\\%s", "20121012");
請愛用 snprintf
snprintf( name, sizeof(name), "..\\Temp\\%s", strdate.c_str() );
想用 std::string 也無不可
fopen( (std::string("..\\Temp\\")+strdate).c_str(), "wb" );
: FILE* fw = fopen(name, "wb");
: : 2.fwrite的問題
: : 目前有個字串,假設為
: : string hextemp="1F 08 08 0A 3A 5C 2E 6F 05"
: : 如果我要以16進制存成.JPG檔,那麼我需要去處理字串中間的空格嗎??
: : 還是只需要把字串直接用fwrite寫成檔案就可以了呢??
: : 目前一直卡在這邊,腦袋一直轉不過來...
: : 我想到的是,先把以上字串存入字元陣列,再用strtok去除中間空格..
: : 然後再把每一個16進位寫到另一個陣列中
: : char temp[]={1F,08,08,0A,3A,5C,2E,6F,05}
: : fwrite(temp, sizeof(temp), 1, fw)
: : 然後再寫入檔案,不曉得是不是我搞錯方向了?其實不用那麼麻煩?
: "1F 08 08 ..." 是字串,
: 以 ANSI C 來說是 char array。
: "1F ..." 中,
: 1 是 ASCII table 中的 49,佔 8 bytes,
: F 是 ASCII table 中的 70,佔 8 bytes...
標準沒有寫字元編碼是用 ASCII
: 你想要的應該是把 0x1F08080A... 大小的值寫到 fw 中。
寫入 1F 08 08... 跟寫入 0x1F0808... 兩操作的結果不一定相等
: 先把 hextemp 轉成 char array,
: 再使用 pointer 去指這個 array 並依序 dereference,
: 每兩個非空白字元,
: 就套一次 atoi(),(說明:(char*) "1F\0" 轉成 (int) 0x1F)
: 再把結果寫至 fw。
據我所知 atoi 是無法解析 hex 字串的.
標準作法:
#include <stdint.h>
#include <inttypes.h>
char const * input = "1F 08 08 0A 3A 5C 2E 6F 05";
while( *input ) {
// 間隔任意數目空白
while( isspace(*input) )
++input;
uint8_t value;
sscanf( input, "%" SCNx8, &value );
fwrite( &value, sizeof(value), 1, fw );
input += 2;
}
注意標色地方需剛好為 8 bits 且沒有任何 padding 才能容納
讀入的數值,
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.221.215
※ 編輯: loveme00835 來自: 140.121.221.215 (10/13 04:04)