Работа с файлами в СИ. Ввод файлов с клавиатуры
Новичок в си и не знаю как сделать такое задание:
- имена файлов исходных данных (в режимах начального формирования и добавления) и файлов результатов должны вводиться с клавиатуры;
- при отсутствии на диске указанного файла в режимах чтения и добавления на экран должно выдаваться предупреждающее сообщение и осуществляться повторный запрос имени файла.
С такой программой:
#define _CRT_NONSTDC_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<locale.h>
#include<math.h>
void main() {
setlocale(LC_ALL, ".1251");
srand(time(NULL));
int A[10];
int i;
int* p = A;
FILE* vvod = fopen("info.txt", "w");
for (i = 0; i < 10; i++) {
*(p + i) = rand();
}
fprintf(vvod, "Массив из 10 чиесел:\n");
for (i = 0; i < 10; i++) {
fprintf(vvod, "%d) %d\n", i + 1, *(p + i));
}
fclose(vvod);
char line[50];
FILE* vivod = fopen("info.txt", "r");
for (i = 0; i < 11; i++) {
fgets(line, 50, vivod);
printf("%s", line);
}
fclose(vivod);
int N = 0;
int masi[20] = {0};
FILE* raschot1 = fopen("info1.txt", "w");
for (i = 0; i < 10; i++) {
if (*(A + i) % 10 == 0) {
fprintf(raschot1, "%d\n", i+1);
N++;
}
}
fclose(raschot1);
FILE* rez = fopen("info.txt", "a");
FILE* vivod1 = fopen("info1.txt", "r");
int r;
char* number[10];
for (r = 0; r < N; r++) {
fgets(number, 10, vivod1);
printf("Число оканчивающиеся на 0 под номером: %s", number);
fprintf(rez, "Число оканчивающиеся на 0 под номером: %s\n", number);
}
fclose(vivod1);
fclose(rez);
int B[6][5], b, d;
FILE* vvod2 = fopen("info2.txt", "w");
printf("\nБаллы, которые набрали спортсмены в каждом виде спорта:\n");
for (d = 0; d < 6; d++) {
for (b = 0; b < 5; b++) {
*(*(B + d) + b) = rand() % 10;
fprintf(vvod2, "%d\t", *(*(B + d) + b));
}
fprintf(vvod2, "\n");
}
fclose(vvod2);
char* line2[20];
FILE* rez1 = fopen("info.txt", "a");
FILE* vivod2 = fopen("info2.txt", "r");
for (i = 0; i < 6; i++) {
fgets(line2, 20, vivod2);
printf("%s", line2);
fprintf(rez1, "%s", line2);
}
fclose(vivod2);
fclose(rez1);
int j, sum[6] = { 0 }, min = 100000, max = 0;
int* sm = sum;
int* mi = &min;
int* ma = &max;
FILE* raschot2 = fopen("info3.txt", "w");
for (i = 0; i < 6; i++) {
for (j = 0; j < 5; j++) {
*(sum + i) += *(*(B + i) + j);
}
if (*(sum + i) > *ma) {
*ma = *(sum + i);
}
if (*(sum + i) < *mi) {
*mi = *(sum + i);
}
}
fprintf(raschot2, "%d, %d", *mi, *ma);
fclose(raschot2);
char* number1[10];
FILE* vivod3 = fopen("info3.txt", "r");
fgets(number1, 10, vivod3);
printf("Количество баллов набранное спортсменами, занявшими последнее и первое место соответственно: %s \n", number1);
fclose(vivod3);
system("pause");
}
Ответы (2 шт):
Автор решения: AlexGlebe
→ Ссылка
Пример открытия файла, связанной с файловым указателем vvod :
FILE * vvod ;
enum { fnamesize = 0x100 } ;
// локальный буфер для имени файла
char fname [ fnamesize ] ;
char * rf ;
do {
fputs ( "Введите имя файла : " , stdout ) ;
rf = fgets ( fname , fnamesize , stdin ) ;
if ( rf ) {
// удаляем в конце перевод строки '\n'
size_t l = strlen ( fname ) ;
if ( l > 0 && fname [ l - 1 ] == '\n' )
fname [ l - 1 ] = '\00' ;
// открываем файл для записи
vvod = fopen ( fname , "w" ) ;
}
if ( rf == NULL || vvod == NULL )
fprintf ( stderr ,
"Файла с именем '%s' не удалось открыть"
" для записи, повторите попытку\n" , fname ) ;
} while ( rf == NULL || vvod == NULL ) ;
У вас массивы char * var [ N ] ; определяют массивы указателей, а не строки букв. Это надо исправить.
//char* number[10];
char number [ 10 ] ;
//char* line2[20];
char line2 [ 20 ] ;
//char* number1[10];
char number1 [ 10 ] ;
Автор решения: billy.herringt0n
→ Ссылка
Просто сделал вот так и всё работает:
FILE* vvod;
printf("Введите имя файла: ");
scanf("%s", i1);
while (((vvod = fopen(i1, "r")) == NULL))
{
printf("Неверное имя файла, повторите попытку: ");
scanf("%s", i1);
}
fclose(vvod);
vvod = fopen(i1, "w");
for (i = 0; i < 10; i++) {
*(p + i) = rand();
}
fprintf(vvod, "Массив из 10 чиесел:\n");
for (i = 0; i < 10; i++) {
fprintf(vvod, "%d) %d\n", i + 1, *(p + i));
}
fclose(vvod);`