2016-12-24 8 views
1

У меня возникли некоторые проблемы при попытке фильтровать слова из файла и записать их в новый файл. То, что я пытаюсь сделать, это написать только слова, которые появляются после «&» до первой цифры.Записать системный вызов C, заполнить филе мусором

Например (Это содержимое файла Читаю с):

& some 12 test1 test2 
$ thisword 4 no no no no 

Для выше входа, я хочу, чтобы записать в новый файл слова только некоторые и thisword ,

Мой код работает, но вместо того, чтобы печатать только эти слова, он также печатает мусор.

int main (argc,argv) 
    int argc; 
    char *argv[]; 
{ 
    int inpfd,outpfd,n; 
    int i=0; 
    char tmp[2],buff[BUFFSIZE]; //This is our buffer 

    //Open the output file of ispell 
    inpfd = open("outputfile.txt",O_RDONLY); 

    //Check if open command failed 
    if(inpfd == -1) { 
     printf("Failed to open file"); 
     exit(1); 
    } 

    //Here we are reading from output file 
    read(inpfd,buff,999); 
    buff[999] = '\0'; 
    close(inpfd); 

    outpfd = open("w.txt",O_WRONLY); 

    if(outpfd == -1) {  
     printf("Cannot open file for writing!"); 
     exit(1); 
    } 

    //Looping over the Buffer 
    for (i=0; i <BUFFSIZE; i++) { 
     printf("This is the char : %c \n",buff[i]); 
     if(buff[i] == '&') { 
      i++; 
      while(!(isdigit(buff[i]))) { //Write into output file 
              //As long as we didnt reach 
       tmp[0] = buff[i];  // To the digit     
       write(outpfd,tmp,1); 
       i++; 
      } 
      write(outpfd,"\n",1); //Moving to the next line 
     } 
    } 
    close(outpfd); 

    return 0; 
} 

Этот вывод файла после написания (я наклеивать только небольшую часть мусора):

some 
thisword 
^@^@^@<FD>^?^@^@<80><B2>-<AD><FD>^?^@^@<B0> 
<B0>be^@^@^@^@೵[^X^?^@^@^@<B4>-<AD><FD>^?^@^@s^X<F0>[^X^?^@^@^@<FF>^@^@^@^@^@^@ 
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@/ 

Я понятия не имею, что это за фигня, может кто-то пожалуйста помочь?

+1

Ваш синтаксис для основной декларации составляет более 30 лет. (помещая типы аргументов между именем функции и телом). Мы настоятельно рекомендуем писать в современном C. – abelenky

+0

. Ваш входной файл ('inpfd') называется' outputfile.txt'? И открыл ReadOnly? Разве вы не думаете, что это немного тупо? – abelenky

+1

У вас нет морального права понять, почему ваша программа терпит неудачу, если вы не пытаетесь проверить сообщение об ошибке, которое пытаются дать ваши системные вызовы. –

ответ

5

Ваша проблема в этом коде

read(inpfd,buff,999); 
buff[999] = '\0'; 
close(inpfd); 

где вы не обращая внимания на фактическую длину, что вы читаете

Вы должны по крайней мере использовать длину данных на самом деле читать - как этот

int len = read(inpfd,buff,999); 
buff[len] = '\0'; 
close(inpfd); 

Однако обратите внимание, что приведенные выше имеют свои проблемы, так как прочитанные не всегда возвращают все за один раз и могут рано прекратить прерывания и т. Д. И т. Д., Но это выходит за рамки сфера охвата этого вопроса. Для очень простых приложений вы можете просто избавиться от простой модификации.

Теперь, после того как нулевое завершение, зная фактическую длину файла из результата чтения, вам также необходимо исправить свой цикл - первым шагом было бы, чтобы ваш внешний цикл просматривал только данные, которые вы читали, поэтому

Таким образом, вместо

for (i=0; i <BUFFSIZE; i++) { 

использовать фактическую длину;

for (i=0; i <len; i++) { 

Ваш код внутри цикла содержит несколько вопросов, а также завершение цикла для одного, что вам также придется исправить.

+0

Благодарим вас за ответ. это не решило мою проблему, есть ли что-нибудь еще, что я могу сделать? Я не знаю количества символов в файле, который я читаю от – user3819295

+0

Ну, вам также нужно исправить свой цикл, поскольку он все еще работает с BUFFSIZE - я обновил ответ с этим, - но есть еще много проблем с программированием что вам нужно будет исправить также, чтобы получить описанную вами функциональность, но те, которые вы должны попытаться решить singlelestep через программу, используя отладчик (gdb, если вы работаете в Linux) – Soren

+0

'read()' возвращает 'ssize_t' not 'int', и это тоже очень хорошо может потерпеть неудачу. – alk

2

Вы перебираете весь размер вашего буфера или 999 предметов.

for (i=0; i <BUFFSIZE; i++) { 

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

+0

Он не опубликовал определение' BUFSIZE', это может быть даже больше, чем '999'. – Barmar

+0

BUFFSIZE - 1000, я понимаю, что он обрабатывает мусор, но почему он пишет мусор в выходной файл? – user3819295