Ширина как переменная при использовании fscanf [дубликат]

14
задан Neal 2 May 2012 в 19:35
поделиться

4 ответа

К сожалению, нет, нет такого модификатора, как '*' для printf, который заставляет scanf получать ширину поля или точность из переменной. Самое близкое, что вы можете сделать, это динамическое создание строки формата:

char format[8];
sprintf(format, "%%%dX", width);
fscanf(in_file, format, &iData);
11
ответ дан 1 December 2019 в 14:43
поделиться

fscanf с %X автоматически остановится на новой строке, верно? Если поля действительно заканчиваются новой строкой (как в вашем примере), то разве вы не можете просто вызвать

fscanf(in_file, "%X", &iData);

и позволить fscanf определить, где конец?

0
ответ дан 1 December 2019 в 14:43
поделиться

Вы также можете рассмотреть возможность использования потоков C++.

#include <ifstream>
#include <iostream>

// open the file and create a file input stream
ifstream file("test.txt" , ios::in | ios::binary);

// loop through the whole file
while (ifs.good())
{
    // extract one byte as the field width
    unsigned char width;
    file.read(&width, 1);

    // extract width number of unformatted bytes
    char * bytes = new char[width];
    file.read(bytes, width);

    // process the bytes
    ...
    delete [] bytes;

    // skip EOL characters if needed
    // file.seekg(1, ios_base::cur)
}

file.close();

Более простым способом, если новые строки включены, как вы, похоже, указываете, было бы использование getLine(). Посмотрите http://www.cplusplus.com/reference/iostream/ifstream/, чтобы узнать больше способов использования read(), get(), getLine() и многих других замечательных функций потоков.

0
ответ дан 1 December 2019 в 14:43
поделиться

Думаю, проще всего будет использовать fread() вот так:

fread(buffer, nbytes, sizeof(char), in_file);
0
ответ дан 1 December 2019 в 14:43
поделиться