Программа C зависает после создания файла

Я делаю упражнение для университета, которое спрашивает:

Создайте программу на C под названием «split», которая принимает файл и число. Программа разделит входной файл на два файла, один из которых называется «part1.txt», который будет содержать первые n байтов, а другой — «part2.txt», который будет содержать остальные байты. Если входной файл содержит менее n байт, файл «part2.txt» не будет создан.

Это моя программа. Что происходит, когда я его запускаю, так это то, что он создает файл part1.txt (без каких-либо записей в нем), и программа зависает. Я смотрю на это в течение дня, но не могу определить проблему. Любая помощь?

Я скомпилировал, используя:

gcc -o split split.c

Когда я его выполняю, я пишу:

./split text.txt 10

Где «text.txt» — это текстовый файл, содержащий слова, которые я точно набрал, нажимая случайные кнопки на клавиатуре.

int splitter;
int fd, fd1, fd2;
char buffer[5000];

int main(int argc, char** argv){

if (argc<2){
  printf("Insert 2 arguments.");
  exit(1);
}

splitter = atoi(argv[2]);

if (fd=open(argv[1], O_RDONLY) < 0){
  perror("Error\n");
  exit(1);
} else {
  if (fd1=open("part1.txt", O_RDWR | O_CREAT, S_IRWXU) <0){
    perror("Error");
    exit(1);
  }
  if (read(fd,buffer,splitter) == splitter){
    write(fd1,buffer,splitter);
    if (fd2=open("part2.txt", O_RDWR | O_CREAT, S_IRWXU)<0){
      perror("Errore");
      exit(1);
    };
    while (read(fd,buffer,1) ==1){
      write(fd2,buffer,1);
    }
    close(fd1);
    close(fd2);
  } else {
    while (read(fd,buffer,1) ==1){
      write(fd1,buffer,1);
    }
    close(fd1);
  }
  close(fd);
}

Почему вы не включаете то, как вы его запускаете, и файлы, которые вы предоставляете в качестве входных данных?

possum 08.01.2023 18:39

я добавил больше информации

Ric97 08.01.2023 18:47

если скобки условия отсутствуют, это должно быть if ((fd=open(argv[1], O_RDONLY)) < 0) другое также для fd1

Hackaholic 08.01.2023 18:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Операторы отношения находятся на уровне 6th таблицы приоритетов C, намного выше, чем операторы присваивания.

Это утверждение:

if (fd=open(argv[1], O_RDONLY) < 0)

эквивалентно:

if (fd = (open(argv[1], O_RDONLY) < 0))

Оператор < возвращает либо 1, либо 0, или, другими словами, true или false, которые присваиваются fd.

Измените его на:

if ((fd = open(argv[1], O_RDONLY)) < 0)

У вас есть такая же проблема в последующем утверждении if.


Из экспертного программирования C:

Некоторые авторитетные источники рекомендуют использовать только два уровня приоритета. помнить в C: умножение и деление предшествуют сложению и вычитание. Все остальное должно быть в скобках. Мы думаем, что отличный совет.

Просто как тот. Спасибо большое, я с ума сошла!

Ric97 08.01.2023 19:13

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

Haris 09.01.2023 02:23

Другие вопросы по теме