Вот простой класс, который обрабатывает файлы raw
и asset
:
открытый класс ReadFromFile {
public static String raw(Context context, @RawRes int id) {
InputStream is = context.getResources().openRawResource(id);
int size = 0;
try {
size = is.available();
} catch (IOException e) {
e.printStackTrace();
return "";
}
return readFile(size, is);
}
public static String asset(Context context, String fileName) {
InputStream is = null;
int size = 0;
try {
is = context.getAssets().open(fileName);
AssetFileDescriptor fd = null;
fd = context.getAssets().openFd(fileName);
size = (int) fd.getLength();
fd.close();
} catch (IOException e) {
e.printStackTrace();
return "";
}
return readFile(size, is);
}
private static String readFile(int size, InputStream is) {
try {
byte buffer[] = new byte[size];
is.read(buffer);
is.close();
return new String(buffer);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
}
Например:
ReadFromFile.raw(context, R.raw.textfile);
И для файлов активов:
ReadFromFile.asset(context, "file.txt");
Сравните с VARIANT_FALSE
. Существует много ошибочного кода, который ошибочно передает значение C ++ bool true
(приведенное к целочисленному значению 1) функции, ожидающей VARIANT_BOOL
. Если вы сравните с VARIANT_FALSE
, вы все равно получите правильное ожидаемое значение.
Приведение к типу bool явно неверно. Некоторые люди говорят (например, комментарии на BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool ) сравнивать с VARIANT_FALSE, но я бы сравнил оба. Таким образом вы обнаружите недопустимые значения (любые, кроме VARIANT_FALSE или VARIANT_TRUE) на ранней стадии.
например,
bool VariantBoolToBool(VARIANT_BOOL varFlag)
{
bool boolFlag;
switch( varFlag )
{
case VARIANT_TRUE:
boolFlag = true;
break;
case VARIANT_FALSE:
boolFlag = false;
break;
default:
throw Exception("Not a valid value");
}
return boolFlag;
}
Зачем нужно явное приведение?
if (my_bool)
{
blargh();
}
else
{
blarglerr();
}
Таким образом, true - это истина, а false - ложь, в соответствии со стандартом C. Если вам нужно УСТАНОВИТЬ стиль C ++ bool
, сделайте что-нибудь вроде:
VARIANT_BOOL vb_bool = VARIANT_FALSE
bool cpp_bool = !!vb_bool
Объявите этот макрос в одном из ваших глобальных заголовков.
#define b(X) ((X)!=VARIANT_FALSE)
РЕДАКТИРОВАТЬ: Более безопасная версия:
inline bool b(VARIANT_BOOL v){return v!=VARIANT_FALSE;}
Стандартные правила преобразования C ++ полагаются на ноль, означающий ложь [и, как указывает 1800 ИНФОРМАЦИЯ, ИСТИННЫЙ вариант - это то место, где происходит наибольшая путаница] и ничего более. Следовательно, лучше всего будет static_cast.
Но во многих случаях код будет более читаемым для сравнения. В этом случае сравнивать VARIANT_BOOL.
В ИСТИННОМ варианте происходит наибольшая путаница] и не более того. Следовательно, лучше всего будет static_cast.Но во многих случаях код будет более читаемым для сравнения. В этом случае сравнивать VARIANT_BOOL.
В ИСТИННОМ варианте происходит наибольшая путаница] и не более того. Следовательно, лучше всего будет static_cast.Но во многих случаях код будет более читаемым для сравнения. В этом случае сравнивать VARIANT_BOOL.
Мне не нравится беспокоиться о совместимости между разными логическими значениями, поэтому я обычно пишу:
VARIANT_BOOL vb_bool = VARIANT_FALSE;
// ... vb_bool set to something by some other code
bool myBool = (vb_bool == VARIANT_TRUE);
Есть ли более мелкие (например, «компилируется в более простой код x86») , действительные способы сделать это? Конечно. Не стоит. Это гарантированно сработает, поэтому я могу беспокоиться о своей бизнес-логике.