как работать с числами в файлах?
Не понимаю, как работать с числами в файлах. Если представить задачу, где есть кол-во цифр, которое заранее известно, то тут дело понятно: while(fscanf(f,%d,&i)>0), а там дальше по заданию. Но что делать с числами, если они не на одной строке? а если их нужно отсортировать как-либо в файле? записать все числа в массив, и уже оттуда с ними работать ведь не получится, переход как-то на другую строку реализовать-то надо. Проблемы появились с этой задачей: Дан текстовый файл, в котором записаны только целые числа. Количество чисел в каждой строке может быть любым, но точно не больше 30. Разделителями между числами являются пробелы и/или знаки табуляции, символов-разделителей может быть больше одного. Требуется записать в новый текстовый файл номера строк исходного файла, последовательности чисел в которых являются строго возрастающими или строго убывающими. Числа записывать по десять в строку через один пробел
Ответы (1 шт):
skipws (skip whitespaces) останавливается или перед первым найденным не пробелом (ungetc), или после конца строки, или в конце файла. В *read попадает количество прочитанных символов (потом пригодится). Удобно чтобы считать строки:
int skipws(FILE *f, int *read) {
for (int n = 0; ; ++n) {
const int c = fgetc(f);
if (c == EOF) {
*read = n;
return c;
}
if (c == '\n') {
*read = n + 1;
return c;
}
if (!isspace((unsigned char)c)) {
ungetc(c, f);
*read = n;
return c;
}
}
}
print печатает числа по десять штук в строке. Параметр *n_prints хранит состояние (чтобы знать когда переводить строки или выводить пробелы), перед первым вызовом его надо обнулить:
void print(int n, int *n_prints) {
if (*n_prints == 10) {
putchar('\n');
*n_prints = 0;
}
if (*n_prints > 0) {
putchar(' ');
}
printf("%d", n);
++*n_prints;
}
Полное решение задачи:
int main() {
int n_prints = 0;
for (int n_line = 1; ; ++n_line) {
bool dsc = true;
bool asc = true;
int prev_n;
for (int k = 0; ; ++k) {
int read;
const int c = skipws(stdin, &read);
if (asc || dsc) {
if ((c == EOF && (k > 0 || read > 0)) || c == '\n') {
print(n_line, &n_prints);
}
}
if (c == EOF) {
return 0;
}
if (c == '\n') {
break;
}
int n;
if (scanf("%d", &n) != 1) {
return 1;
}
if (k > 0) {
asc &= prev_n < n;
dsc &= prev_n > n;
}
prev_n = n;
}
}
putchar('\n');
}