2016-12-24 39 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); 

但是請注意,上面有它自己的問題,因爲讀並不總是一次返回一切,並可以提前終止中斷等等,但這是超越這個問題的範圍。對於非常簡單的應用程序,您可能只是簡單的修改而已。

現在,在null知道結果讀取文件的實際長度後,您還需要修復您的循環 - 第一步是讓您的外循環只查看您讀取的數據,所以

所以不是

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

使用的實際長度;

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

你的循環內的代碼也包含幾個問題,循環終止一個,你將不得不修復。

+0

謝謝你的回覆。這並沒有解決我的問題,還有什麼我可以做的嗎?我不知道我正在閱讀的文件中的字符數是多少 – user3819295

+0

好吧 - 您還需要修復您的循環,因爲它仍然運行到BUFFSIZE - 我更新了答案 - 但有更多的編程問題你必須修復以獲得你所描述的功能 - 但是那些你應該嘗試通過使用調試器的程序解決單步執行(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