Копирование файла и запись информации о файле в обратном направлении - PullRequest
1 голос
/ 02 апреля 2019

Нужно создать копию файла, который был ранее создан с пятнадцатью случайными числами внутри, и в этой копии записать эти числа в обратном направлении.

Я попытался прочитать файл с помощью for () и записать в массив, который также заполнит вновь созданный файл с помощью for (), но IDE останавливает сценарий, как только он переходит к for ().

#include <stdio.h>
#include <stdlib.h>

int main(){
char a[20], sf[20], tf[20];
FILE *source, *target;
int i;

printf("Enter name of file to copy\n");
gets(sf);

source = fopen(sf, "r");

if (source == NULL){
    printf("Press any key to exit...\n");
    exit(1);
}

printf("Enter name of target file\n");
gets(tf);

target = fopen(tf, "w");

if (target == NULL){
    fclose(source);
    printf("Press any key to exit...\n");
    exit(1);
}

for(i=0;i<15;i++){
    fscanf(source, "%d", a[i]);
    //printf("%d\n", a[i]);
}
for(i=15;i>0;i--){
    fprintf(target, "%d\n", a[i]);
}

//printf("File copied successfully.\n");

return 0;
}

1 Ответ

3 голосов
/ 02 апреля 2019

Некоторые замечания:

  • , как сказано в замечании, которое вы прочитали int , поэтому вам нужен массив int , а не массив char для их сохранения, в настоящее время вы будете писать из a с неопределенным поведением

  • если вам нужно сохранить 15 значений, достаточно массива для 15, 20 (предположим, int ) бесполезно

  • никогда использовать получает , он устарел (с годами) из-за опасности, используйте fgets , чтобы не рисковать для записи из получая строку, и не забудьте убрать вероятный перевод строки

  • может быть, входной и выходной файлы будут одинаковыми, поэтому сначала прочитайте, прежде чем открыть выходной файл и запишите его содержимое

  • fscanf(source, "%d", a[i]); недопустимо и должно быть fscanf(source, "%d", &a[i]);

  • проверить результат fscanf для управления ошибками во входном файле

  • fprintf(target, "%d\n", a[i]); должно быть fprintf(target, "%d\n", a[i-1]);

  • для явного fclose выходной файл лучше на случай, если впоследствии вы преобразуете вашу программу во что-то более сложное


Предложение:

#include <stdio.h>
#include <string.h>

#define N 15

FILE * openIt(const char * msg, const char * dir)
{
  char fn[256];

  printf(msg);

  if (fgets(fn, sizeof(fn), stdin) == NULL)
    /* EOF */
    return NULL;

  char * p = strchr(fn, '\n');

  if (p != NULL)
    *p = 0;

  FILE * fp = fopen(fn, dir);

  if (fp == NULL)
    fprintf(stderr, "cannot open '%s'\n", fn);

  return fp;
}

int main()
{
  FILE * fp;

  if ((fp = openIt("Enter name of file to copy\n", "r")) == NULL)
    return -1;

  int a[N], i;

  for (i = 0; i != N; ++i) {
    if (fscanf(fp, "%d", &a[i]) != 1) {
      fprintf(stderr, "invalid integer rank %d\n", i);
      fclose(fp);
      return -1;
    }
  }

  fclose(fp);

  if ((fp = openIt("Enter name of target file\n", "w")) == NULL)
    return -1;

  while (i--) {
    fprintf(fp, "%d\n", a[i]);
  }

  fclose(fp);

  return 0;
}

Компиляция и исполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra r.c
pi@raspberrypi:/tmp $ cat in
1 2 3 4 5
6 7 8 9 10
11 12
13
14
15
not read
pi@raspberrypi:/tmp $ ./a.out
Enter name of file to copy
in
Enter name of target file
out
pi@raspberrypi:/tmp $ cat out
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
pi@raspberrypi:/tmp $ ./a.out
Enter name of file to copy
out
Enter name of target file
out
pi@raspberrypi:/tmp $ cat out
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pi@raspberrypi:/tmp $ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...