Я озадачен следующим различием в поведении:
// suppose myfile.txt contains a single line with the single character 's'
errno_t res;
FILE* fp;
char cmd[81];
res = fopen_s(&fp, "D:\\myfile.txt", "rb" );
fscanf(fp,"%80s",cmd); // cmd now contains 's/0'
fclose(fp);
res = fopen_s(&fp, "D:\\myfile.txt", "rb" );
fscanf_s(fp,"%80s",cmd); // cmd now contains '/0' !
fclose(fp);
Результаты не зависят в порядке вызова (т.е. называют fscanf_s сначала, Вы получили бы пустую строку сначала). Скомпилированный на VC ++ - VS2005. Кто-либо может воспроизвести? Кто-либо может объяснить?
Спасибо!
Из документов на fscanf_s ()
, http://msdn.microsoft.com/en-us/library/6ybhk9kc.aspx :
Основное различие между безопасными функциями (с суффиксом _s) и старыми функциями заключается в том, что безопасные функции требуют, чтобы размер каждого поля c, C, s, S и [type передавался в качестве аргумента сразу после Переменная. Для получения дополнительной информации см. Scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l и scanf Width Specification.
И http://msdn.microsoft.com/en-us/library/w40768et.aspx :
В отличие от scanf и wscanf, scanf_s и wscanf_s требуют, чтобы размер буфера был указан для всех входные параметры типа c, C, s, S или [. Размер буфера передается как дополнительный параметр сразу после указателя на буфер или переменную.Например, при чтении строки размер буфера для этой строки передается следующим образом:
char s [10];
scanf ("% 9s", s, 10);
Таким образом, вы должны вызвать это примерно так:
fscanf_s(fp,"%80s",cmd, sizeof(cmd));
fscanf_s
(и все семейство scanf_s
) требует, чтобы вы передавали размер любого %c
, %C
, %s
, %S
или %[
после самого буфера; вы опускаете этот аргумент:
fscanf_s(fp, "%80s", cmd, 81);
Ваш вопрос помечен тегом C ++, и вы компилируете на VC ++, но используете fscanf? Получите std :: ifstream.
std::string buffer;
std::ifstream fp("my filepath");
fp >> buffer;