Я делаю упражнение для университета, которое спрашивает:
Создайте программу на 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);
}
я добавил больше информации
если скобки условия отсутствуют, это должно быть if ((fd=open(argv[1], O_RDONLY)) < 0)
другое также для fd1
Операторы отношения находятся на уровне 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: умножение и деление предшествуют сложению и вычитание. Все остальное должно быть в скобках. Мы думаем, что отличный совет.
Просто как тот. Спасибо большое, я с ума сошла!
В любой момент. Подумайте о дополнительных флагах, которые вы могли бы скомпилировать, я уверен, что -Wall
будет что сказать об отсутствующих скобках.
Почему вы не включаете то, как вы его запускаете, и файлы, которые вы предоставляете в качестве входных данных?