ラベル programming の投稿を表示しています。 すべての投稿を表示
ラベル programming の投稿を表示しています。 すべての投稿を表示

2013年8月24日土曜日

UTF-8 BOMなしはVisual Studio 2010にとってはunicodeではない

UTF-8 BOMなしでコードを書いていますと,
「warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。」
と言われます.いや,Unicodeですがな,と思うのですが,Visual StudioはUTF-8 BOMありでないとUnicodeとして扱ってくれないらしいのです.コメントに日本語を使うのをやめるのがよいでしょうか.

2013年2月17日日曜日

cudaMallocの速度

cudaMallocに要する時間の測定結果.

環境

  • windows 8 64bit
  • visual c++ 2010 express
  • cuda 5.0
  • intel core-i5 3317 1.70GHz
  • GeForce GT 620M
  • cudaMallocとcudaFreeだけ,転送はしない
結果

  • 0.3msec / cudaMalloc()
  • サイズ4Mくらいまでは一定時間と考えてよい
  • 大規模な処理なら無視できるが,時間にシビアな用途(画像処理など,1/60=16.7msecで作業を終わらせる必要があるなど)では,複数回実行すると実行時間に影響を与えるレベル.



2013年2月14日木曜日

typedefされている型が,同じかどうか調べる

typedefされている型が,同じかどうか調べる.
typeidを使う.
typeinfoをインクルードする.


#include <iostream>
#include <typeinfo>
typedef int type_a;
typedef int type_b;
typedef short type_c;
int main(int argc, char **argv)
{
  if (typeid(type_a) == typeid(type_b)) {
    std::cout << "same" << std::endl;
  } else {
    std::cout << "different" << std::endl;
  }
  if (typeid(type_a) == typeid(type_c)) {
    std::cout << "same" << std::endl;
  } else {
    std::cout << "different" << std::endl;
  }
  return 0;
}

2012年12月22日土曜日

ifstream でテキストファイルを読み込む場合のあれこれ

ファイル名の指定

C++11から,std::stringが直接使えるようになったが,
C++11以前は const char * のみ.

std::string filename("hoge.txt");
std::ifstream f(filename.c_str());

ファイルが正しく開いたかのチェック

bad()ではダメで,fail()を使う.あるいは,!f でもよろしい.
! 演算子は fail と同じ.
http://en.cppreference.com/w/cpp/io/basic_ifstream
しかし,宣言だけしてファイルを開く処理を行っていない場合(うっかり忘れている場合)も fail() は false なので,結局,is_open() ファイルオープンの検査には最良か.


順に,宣言だけ,ファイルあり,ファイルなし

f true,true,false
f.bad() false,false,false
f.fail() false,false,true
f.good() true,true,false
f.is_open() false,true,false



また当然の挙動であるが,

f.eof() false,false,false

たとえ,サイズ0バイトのファイルを開いても,f.eof()はtrueにならない(読み込み処理を一度でも行わないとフラグが立たないと思われる.まあそれはそうだろう).


以下,テスト用のコード:

  std::ifstream f;
  f.open("sample.txt");

  if (f) {
    std::cout << "f" << std::endl;
  }
  if (f.fail()) {
    std::cout << "f.fail" << std::endl;
  }
  if (f.bad()) {
    std::cout << "f.bad" << std::endl;
  }
  if (f.good()) {
    std::cout << "f.good" << std::endl;
  }
  if (f.is_open()) {
    std::cout << "f.is_open" << std::endl;
  }
  if (f.eof()) {
    std::cout << "f.eof" << std::endl;
  }

ファイルから1行 string に読み込む

ifstreamのメンバ関数ではなくて,std::getline を使う.
行末の改行は削除される.

#include <fstream>
#include <string>

std::ifstream f("sample.txt");
std::string s;
std::getline(f, s);


ファイルの終端に達したかチェックする

f.eof()を使ってwhileでくりかえせばよい.
1行ずつ読み込んでから解釈するのであれば,これで十分.