fscanf / fscanf_s разница в поведении - PullRequest
7 голосов
/ 24 июня 2010

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

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

Спасибо!

Ответы [ 3 ]

8 голосов
/ 24 июня 2010

Из документов 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 Спецификация ширины.

И 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));
6 голосов
/ 24 июня 2010

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

fscanf_s(fp, "%80s", cmd, 81);
2 голосов
/ 24 июня 2010

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

std::string buffer;
std::ifstream fp("my filepath");
fp >> buffer;
...