fscanf / fscanf_s различие в поведении

Я озадачен следующим различием в поведении:

// 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. Кто-либо может воспроизвести? Кто-либо может объяснить?

Спасибо!

7
задан Kate Gregory 25 June 2010 в 12:30
поделиться

3 ответа

Из документов на 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));
8
ответ дан 6 December 2019 в 12:46
поделиться

fscanf_s (и все семейство scanf_s) требует, чтобы вы передавали размер любого %c, %C, %s, %S или %[ после самого буфера; вы опускаете этот аргумент:

fscanf_s(fp, "%80s", cmd, 81);
6
ответ дан 6 December 2019 в 12:46
поделиться

Ваш вопрос помечен тегом C ++, и вы компилируете на VC ++, но используете fscanf? Получите std :: ifstream.

std::string buffer;
std::ifstream fp("my filepath");
fp >> buffer;
2
ответ дан 6 December 2019 в 12:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: