Я работаю над реализацией команды cat linux. На данный момент он может читать из стандартного ввода, когда после команды не передаются никакие аргументы, и последовательно читать из нескольких файлов, но когда в качестве аргумента передается '-', вместо этого выводится предыдущий вывод перед чтением из стандартного ввода в некоторых случаях. ,
Например, если вы передадите - file1.txt - file2.txt - в качестве аргумента, все будет работать как положено. Он читает из стандартного ввода, выводит содержимое файла file1.txt, снова читает из stdin и так далее. Но если я удаляю первый '-', другими словами, если первый аргумент является файлом, он выводит содержимое file1.txt, затем читает из stdin, затем печатает содержимое второго файла и затем вместо чтения из stdin, как и раньше, при первом чтении со stdin он снова выводит содержимое второго файла с последующим вводом, после чего он начинает нормально функционировать.
Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 1024
void readStdin(){
char buffer[BUF_SIZE];
while(fgets(buffer, BUF_SIZE, stdin)){ //reads from the standard input and prints the input
char *content = malloc(sizeof(char*)*BUF_SIZE);
if(content == NULL){ //failed to allocate memory
exit(1);
}
strcat(content, buffer);
//printf("buffer: %s", buffer);
//printf("content: %s", content);
printf(content);
memset(&content[0], 0, sizeof(*content));
free(content);
//printf("bufferEND: %s", buffer);
//printf("contentEND: %s", content);
}
}
void readArgs(int argc, char* argv[]){
FILE* fp;
char ch;
for (int i=1; i<argc; i++){
if (*argv[i] == '-'){
readStdin();
clearerr(stdin);
}
//else if ()
else {
fp = fopen(argv[i], "r");
if (fp==NULL){ //in case the file doesn't exist
printf("%s: No such file or directory\n", argv[i]);
exit(1);
}
while ((ch=fgetc(fp)) != EOF){
putchar(ch);
}
// fflush(stdin);
fclose(fp);
}
}
}
int main(int argc, char* argv[]){
if (argc<2){
readStdin();
return 0;
}
readArgs(argc, argv);
return 0;
}
Есть подсказка?
РЕДАКТИРОВАТЬ: если я передаю другой файл, за которым следует другой '-', после чтения из stdin ошибочным способом, описанным выше, он не только получает то же самое, но и не печатает первый символ предыдущего вывода