У функций GetPrivateProfileXXX Windows (используемых для работы с файлами INI) есть некоторые странные правила, касающиеся обработки длин буфера.GetPrivateProfileString - Длина буфера
документация состояния GetPrivateProfileString в:
Если [..] прилагаемый буфер назначения слишком мал, чтобы держать запрошенную строку, строка обрезается и последующим нулевым символом, а возвращаемое значение равно nSize минус один.
Я прочитал это, и я понял, что такое поведение делает невозможным провести различие между двумя сценариями в-коде:
- Когда длина строковое значение в точности равно nРазмер: - 1.
- Когда значение nSize (т.е. буфер) слишком мало.
Я думал, что эксперимент:
У меня есть это в файле INI:
[Bar]
foo=123456
И я назвал GetPrivateProfileString с этими аргументами, как тест:
// Test 1. The buffer is big enough for the string (16 character buffer).
BYTE* buffer1 = (BYTE*)calloc(16, 2); // using 2-byte characters ("Unicode")
DWORD result1 = GetPrivateProfileString(L"Bar", L"foo", NULL, buffer, 16, fileName);
// result1 is 6
// buffer1 is { 49, 0, 50, 0, 51, 0, 52, 0, 53, 0, 54, 0, 0, 0, 0, 0, ... , 0, 0 }
// Test 2. The buffer is exactly sufficient to hold the value and the trailing null (7 characters).
BYTE* buffer2 = (BYTE*)calloc(7, 2);
DWORD result2 = GetPrivateProfileString(L"Bar", L"foo", NULL, buffer, 7, fileName);
// result2 is 6. This is equal to 7-1.
// buffer2 is { 49, 0, 50, 0, 51, 0, 52, 0, 53, 0, 54, 0, 0, 0 }
// Test 3. The buffer is insufficient to hold the value and the trailing null (6 characters).
BYTE* buffer3 = (BYTE*)calloc(6, 2);
DWORD result3 = GetPrivateProfileString(L"Bar", L"foo", NULL, buffer, 6, fileName);
// result3 is 5. This is equal to 6-1.
// buffer3 is { 49, 0, 50, 0, 51, 0, 52, 0, 53, 0, 0, 0 }
Программа, вызывающая этот код, не сможет точно знать, действительно ли фактическое значение ключа составляет 5 символов или даже 6, как в последних двух случаях Результат равен nSize - 1.
Единственным решением является проверка всякого результата == nSize - 1 и вызов функции с большим буфером, но это было бы необязательно в тех случаях, когда буфер имеет ровно правильный размер.
Нет ли лучшего способа?
Предполагается, что это код C или C++? –