#include #include #include #include #include #include // пример программы обработки текстового файла // средствами системых вызовов Linux int main(int argc, char *argv[]) { int hIn, hOut, numRead, letter, count, insert=0, total= 0; char in[80]={0}, out[80]={0}, *pos; char c, buf, sym; //printf("argc=%d\n",argc); while ( (c = getopt(argc, argv, "i:o:s:c:")) != -1) { //printf("%s",argv[optind-1]); //printf("%d",optind); switch (c) { case 'i': strcpy(in,argv[optind-1]); break; case 'o': strcpy(out,argv[optind-1]); break; case 's': sym=argv[optind-1][0]; break; case 'c': count = atoi(optarg); break; } } //if (optind != argc) { if (argc<9) { printf("Usage: ./file -i inputfile -o outputfile -s symbol -c count\n"); exit(-1); } // вставляемый символ //sym=argv[2][0]; // число замен //count=atoi(argv[3]); // низкоуровневое открытие файла на чтение //hIn = open( argv[1], O_RDONLY); hIn = open( in, O_RDONLY); if (hIn<0) { printf("Error %d (%s) while open input file: %s!\n",errno, strerror(errno),in); exit(-2); } // формирование имени выходного файла //strcpy(out,argv[1]); pos = strstr(out,"."); if (pos == NULL) strcat(out, ".out"); else { letter = pos - out; //printf("Искомая строка начинается с символа %d\n", pos - filename + 1); out[letter + 1] = 'o'; out[letter + 2] = 'u'; out[letter + 3] = 't'; out[letter + 4] = 0; //printf("output file name:%s\n", out); } // низкоуровневое открытие файла на запись hOut = open( out, O_RDWR | O_CREAT| O_TRUNC, S_IRUSR | S_IWUSR); if (hOut<0) { printf("Error %d (%s) while open output file: %s!\n",errno, strerror(errno),out); exit(-2); } // цикл до конца файла do { // посимвольное чтение из файла numRead = read( hIn, &buf, 1); if (buf == 0x20) { total++; if(total>count) write(hOut, &buf,1); else { write(hOut, &sym,1); insert++; } } else write(hOut, &buf,1); } while (numRead > 0); // Закрытие файла close( hIn); close( hOut); printf("(PID: %d), output file %s, symbol %c, inserted %d times\n", getpid(), out,sym, insert); // возвращаемое программой значение return( insert); }