Я пытаюсь понять, как работать с числами из текстовых файлов с использованием массивов - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь написать простую программу, которая использует потоки и позволяет мне помещать цифры с клавиатуры в текстовый файл, а затем показывать их. Я новичок в кодировании и пытаюсь обучаться на темы. Все работает хорошо, пока программа не попытается взять последний номер из текстового файла и найти факториал. Я могу ввести любое число, но программа всегда думает, что последнее число в файле равно 0.

Мой вывод выглядит так:

count = 120
Second thread takes the last digit: 0
Second thread finds factorial of that digit: 1
Second thread writes it in the file as a new last digit
120
1

Мой код:

#include <pthread.h>
#include <stdio.h>
#define N 80

int count;
int atoi(const char *nptr);
void *potok(void *param);
void *potok2(void *param);
FILE *file;
char arr[N];
pthread_mutex_t lock;

int main(int argc, char *argv[])
{
  pthread_t tid;
  pthread_t tid2;
  pthread_attr_t attr;

  if (argc != 2)
  {
    fprintf(stderr, "usage: progtest <integer value>\n");
    return -1;
  }

  if (atoi(argv[1]) < 0)
  {
    fprintf(stderr, "Argument %d can't have negative value\n",atoi(argv[1]));
    return -1;
  }

  pthread_attr_init(&attr);
  pthread_mutex_init(&lock,NULL);
  pthread_create(&tid,&attr,potok,argv[1]);
  pthread_join(tid,NULL);
  printf("count = %d\n",count);

  pthread_create(&tid2,&attr,potok2,NULL);
  pthread_join(tid2,NULL);

  pthread_mutex_destroy(&lock);

  file = fopen("hello.txt", "r");
  while (fgets(arr,N,file) != NULL)
  {
    printf("%s", arr);
  }
}

void *potok(void *param)
{
  int i, upper = atoi(param);
  count = 0;

  if (upper > 0)
  {
    for (i = 1; i <= upper; i++)
    count += i;
  }
  pthread_mutex_lock(&lock);
  file = fopen("hello.txt", "a");
  fprintf(file, "%i\n", count);
  fclose(file);
  pthread_mutex_unlock(&lock);
  pthread_exit(0);
}

void *potok2(void *param)
{
  char arr2[N];
  int c,f=1;
  int b = 0;
  pthread_mutex_lock(&lock);
  file = fopen("hello.txt", "a");
  while (fgets(arr2,N,file) != NULL)
  {
    b++;
  }
  printf("Second thread takes the last digit: %d\n", arr2[b]);
  for (c = 1; c <= arr2[b]; c++)
  {
    f = f * c;
  }
  printf("Second thread finds factorial of that digit: %d\n", f);
  printf("Second thread writes it in the file as a new last digit\n");
  fprintf(file,"%i\n",f);
  fclose(file);
  pthread_mutex_unlock(&lock);
  pthread_exit(0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...