Проблема с записями в файл
Мне нужно, чтобы содержимое одного файла (в нем 37 записей) раскидать по sqrt(37) файлам (с округлением в большую сторону). Собственно, в чем проблема: мой код не делает последнюю запись в 7 файл (Он его даже не создает). Подскажите, что мне поправить. Заранее благодарен.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int main(void) {
FILE* fp;
FILE* fp2;
int n, count; // n - количество записей в файле, count- количество файлов
char buffer[3];
char name[80] = "TMP";
double tmp1, tmp2, tmp3;
if ((fp = fopen("Data.txt", "r")) == NULL) {
printf("File not opened\n");
_getch();
exit(EXIT_FAILURE);
}
else
printf("File opened\n");
fscanf(fp, "%d", &n);
count = sqrt(n);
printf("%d", count);
for (int i = 0; i < count; i++) {
name[3] = 0;
_itoa(i + 1, buffer, 10);
strcat(name, buffer);
strcat(name, ".txt");
if ((fp2 = fopen(name, "w")) == NULL) {
printf("File fp2 not opened\n");
_getch();
exit(EXIT_FAILURE);
}
for (int j = 0; j < n / count; j++) {
fscanf(fp, "%lf %lf %lf", &tmp1, &tmp2, &tmp3);
fprintf(fp2, "%lf %lf %lf\n", tmp1, tmp2, tmp3);
}
fclose(fp2);
}
_getch();
return 0;
}
Ответы (2 шт):
Говорите, n == 37?
Тогда
count = sqrt(n);
дает 6;
for (int i = 0; i < count; i++) {
выполняется 6 раз - 0, 1, ..., 5.
О каком седьмом файле вы говорите?
Прошу простить меня за непонятный вопрос. В следующий раз буду внимательнее.
Это лишь часть всей задачи, которую мне надо решить. В ней нужно раскидать n записей по sqrt(n) файлам, затем отсортировать их в каждом файле и далее слить все воедино. О первой части задачи я и спросил Вас. Но, к счастью, через некоторое время это пришло мне в голову. Может кому-то оно пригодится.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int main(void) {
FILE* fp; // указатель на файл с которого будет считывать
FILE* fp2; // указатель на второй файл, в который будем записывать
int n, k = 0; // n - первая строка в fp, в ней содержится количество записей в файле
// k - переменная- ограничитель для последнего файла
char buffer[3]; // переменная для хранения цифры, которую мы превратим в строку
char name[80] = "TMP"; // скелет для создаваемых файлов
double tmp;
int files, lines, columns; // количество файлов, строк и столбцов
if ((fp = fopen("Data.txt", "r")) == NULL) {
printf("File not opened\n");
_getch();
exit(EXIT_FAILURE);
}
else
printf("File opened\n");
fscanf(fp, "%d", &n);
files = ceil(sqrt(n));
lines = ceil(n / (ceil(sqrt(n))));
columns = 3; // в файле записи идут по 3 столбца
for (int i = 0; i < files; i++) { // отвечает за создание файлов
name[3] = 0;
_itoa(i + 1, buffer, 10);
strcat(name, buffer);
strcat(name, ".txt");
if ((fp2 = fopen(name, "w")) == NULL) {
printf("File fp2 not opened\n");
_getch();
exit(EXIT_FAILURE);
}
for (int j = 0; j < lines; j++) { // отвечает за строки в файле
while (k < columns) { // отвечает за столбцы в файле
if (fscanf(fp, "%lf", &tmp) == EOF)
break;
fprintf(fp2, "%.1lf ", tmp);
k++;
}
fprintf(fp2, "\n");
k = 0;
}
fclose(fp2);
}
fclose(fp);
printf(" P r e s s a n y k e y . . .");
_getch();
return 0;
}