Отобрать данные из текстового файла - C (СИ)
Формулировка задачи:
Здравствуйте! Есть задача, решение которой я хочу написать на С, но данные к условию (для удобства) хочу взять из текстового файла, где, кроме того, собираюсь комментировать эти данные. То есть из самого файла мне нужно выбрать нужную строку и взять из нее только числовое значение, которое начинается после определенного символа или номера символа, все остальное, после пробела, мусор.
Программу закончил тем, что решил проверить, что оно мне взяло из файла. Правильно введено только первое значение Р0. Это связано с используемой мною функцией fgets, т.к. она останавливается после прочтения первой строки. Какую функцию использовать, чтобы искать по всему файлу, а не только по первой строке? Или как для этого исправить fgets? Она просто удобна тем, что останавливает чтение после пробела и после него можна комментировать данные.
Я еще очень зеленый новичок в Си, поэтому если нужны обьяснения, комментарии по моему способу написания программы или если еще что-то не понятно — спрашивайте.
использовать
результат тот же, но искать должно же по всему файлу теперь. Что не так? Может с if намудрил дальше?
#include <stdio.h> #include <string.h> main() { char datas[200]; float P0, P1, V, R, T1, mu; FILE *data; data=fopen(«C:\\Users\\Vlad\\Desktop\\nozzle\\data.txt», «r»); if ( data == NULL ) { printf(«no data»); return 1; } char p0[]=»P0″, p1[]=»P1″, v[]=»V», r[]=»R», t1[]=»T1″, MU[]=»mu»; while (fgets(datas, 200, data)) { if (0==strncmp (datas, p0, strlen(p0))) { sscanf (datas+strlen(p0)+1, «%f», &P0); } if (0==strncmp (datas, p1, strlen(p1))) { sscanf (datas+strlen(p1)+1, «%f», &P1); } if (0==strncmp (datas, v, strlen(v))) { sscanf (datas+strlen(v)+1, «%f», &V); } if (0==strncmp (datas, r, strlen(r))) { sscanf (datas+strlen(r)+1, «%f», &R); } if (0==strncmp (datas, t1, strlen(t1))) { sscanf (datas+strlen(t1)+1, «%f», &T1); } if (0==strncmp (datas, MU, strlen(MU))) { sscanf (datas+strlen(MU)+1, «%f», &mu); } break; } printf («P0=%f, P1=%f, V=%f, R=%f, T1=%f, mu=%f», P0, P1, V, R, T1, mu); }
Попробовал вместо строчки
while (fgets(datas, 200, data))
while (fscanf (data, «%s», datas))
Решение задачи: «Отобрать данные из текстового файла»
textual
Листинг программы
#include "stdafx.h" #include <stdio.h> #include <string.h> #include <errno.h> #include <locale.h> int main() { FILE *f; char s[255] = { 0 }; int i=0; setlocale(LC_ALL, "Rus"); if (fopen_s(&f, "d:\\1\\data.txt", "r")) { strerror_s(s,255, *_errno()); printf("Ой что-то мне нехорошо (%d), %s...",*_errno(),s); getchar(); return 1; }; while (!feof(f)) { if (fscanf_s(f, "%[^=]=%d", s, 255, &i, sizeof(i)) == 2) { printf("%20s = %10d\n", s, i); fscanf_s(f, "%[^\n]s", s, 255); } } fclose(f); getchar(); return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
stdafx.h
может использоваться для обеспечения совместимости между различными компиляторами или платформами.stdio.h
содержит функции для ввода и вывода данных.string.h
содержит функции для работы со строками.errno.h
содержит описания ошибок для функций ввода-вывода.locale.h
содержит функции для работы с локалью.
- Функция
main()
является точкой входа в программу. - Открываем файл для чтения с помощью функции
fopen_s()
.- Если файл не может быть открыт, то выводится сообщение об ошибке с помощью функции
strerror_s()
. - Сохраняем адрес ошибки в переменной
_errno()
для последующего использования.
- Если файл не может быть открыт, то выводится сообщение об ошибке с помощью функции
- Проверяем успешность открытия файла с помощью функции
feof()
. - Читаем данные из файла с помощью функции
fscanf_s()
.- Формат чтения:
%[^=]=%d
означает, что мы читаем строку до знака равенства и конвертируем следующую строку в целое число. - При успешном чтении данных выводим их на экран с помощью функции
printf()
. - С помощью функции
fscanf_s()
также считываем новую строку.
- Формат чтения:
- Закрываем файл после чтения с помощью функции
fclose()
. - Возвращаем 0, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д