#c #text
#c #текст
Вопрос:
У меня есть файл, содержащий это:
JS;John Silver;27264543
и я хочу получить информацию отдельно, вот так:
Имя: Джон Сильвер,
Код: JS
Телефон: 27264543
Я использую это:
while(!eof(fp2))
{
fread(line, 1, 100,fp2);
fscanf(fp2,"%s;%[^;]s,%[^;]d",p.code, p.name, p.tel);
}
printf("Code: %sn", p.code);
printf("Name: %sn",p.name);
printf("Telephone: %dn",p.tel);
p
является ли структура;
Но не работает, происходит сбой. Что я делаю не так?
С уважением
Комментарии:
1. Вы проверяете конец файла на
fp
, но выполняете fread наfp2
… Похоже, что вы пытаетесь прочитать дальше некоторой предварительной записи, чтобы расположиться на первой записи, но делаете это не в том файле. Или это может быть просто совершенно не связано, и я ошибаюсь 🙂2. должен ли fp2 вместо этого быть fp (указатель на файл?). Какой смысл в fread, если вы читаете другой указатель на файл? Лучшим способом было бы запустить scanf в «строке» после чтения из файла.
3. Вы не показали определение
p
, ни как вы его инициализировали. Без этой информации на ваш вопрос невозможно ответить. Что действительно выскакивает наружу, так это то, что вы считываете телефонный номер как целое число, но пытаетесь напечатать его в виде строки.4. Нюхай, нюхай … Пахнет домашним заданием …
5. Уже исправил это, но проблема в fscanf
Ответ №1:
Если p.tel
является int
, то вам нужно передать указатель на него в fscanf
. Попробуйте amp;p.tel
вместо этого использовать в качестве параметра.
(Однако, это всего лишь предположение, потому что у нас нет определения типа p
.)
Ответ №2:
Вам нужно проверить возвращаемое значение scanf()
, а не просто предполагать, что оно сработало.
if (fscanf(fp,"%s;%[^;]s,%[^;]d",p.code, p.name, p.tel) != 3) /* handle error */;
Подсказка: строка вашего примера возвращает 2 из scanf. Сбой scanf в литерале s
"%s;%[^;]s,%[^;]d"
/* HERE ^ */
Комментарии:
1. Что вы имеете в виду, говоря о возврате 2? Спасибо
2. Какой тип возвращаемого
scanf()
?int
. Что этоint
значит? В случае 0 или более это означает количество выполненных назначений: вам нужно 3 назначения, чтобы ваша программа «работала».