2014-03-04 80 views
1

我必須編寫一個程序,該命令從命令行獲取文件名。 然後從文件中讀取幾個字節,查找可打印字符的字符串(ASCII值在32126之間)。 然後打印出字符串。 一個字符串是至少運行至少4個連續可打印字符,並在遇到不可打印字符時結束。 只要找到這樣的字符串,就可以在新行上打印出來。讀取可打印ASCII字符的文件的字節

我至今是:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]){ 
    FILE *fp; 
    fp = fopen(argv[1], "rb"); 
    char buffer; 

    while(fp != NULL) 
    { 
     fread(&buffer, 1, 1, fp); 
    } 

    fclose(fp); 
} 

我覺得這它的命令行採取的程序,並通過1在文件1的所有字節讀取,並將它們存儲到buffer。 現在我需要檢查數組的每個部分,看看每個元素是否在32136之間。 如果是,我將這些字節添加到另一個數組,直到有一個字節不在此範圍內。 對buffer陣列的整體執行此操作。 這是一種代碼方法,到目前爲止是否正確?

回答

0

稍微改變while循環。你正在檢查的是文件是否退出或不在你想要的結果的循環中。

fp與NULL配合以確定文件打開是否成功,因爲如果打開文件或者出現錯誤,文件返回的文件地址爲fopen。

if(fp == NULL) 
{ 
    perror("Error while opening the file\n"); 
    exit(0); 
} 

你想要做的是下面幾行:

while((ch = fgetc(fp)) != EOF) { // reads character by character from the file 
    if((ch <32) || (ch>136)) // check if it is in range to printed 
     break; 
    else 
     printf("%c",ch); // format whoever you want 
} 
0

如果我理解正確的話,你希望你的程序從文件中讀取字符(文件可能包含非打印字符),檢查字符是否落在32到126(可打印字符)的範圍內。如果是,則將該字符添加到緩衝區並讀取更多字符,直到找到不可打印的字符。它還應該確保字符串至少有4個字符;字符串應該打印在換行符上。 以下是可能對您有幫助的代碼。它是用gcc編譯的,我希望它也適用於你。

#include <stdio.h> 
#include <stdlib.h> 


int main(int argc, char *argv[]) { 

FILE *fp; 
char buf[100], ch; //the size of the array would vary according to your need 
int i=0; 

//check for enough arguments 
if(argc<2) 
{ 
    printf("\nInsufficient Arguments.\n"); 
    printf("\nUsage: PrintChar <file>\n\n"); 
    return 1; 
} 

//open the file in binary mode and check for exisitence of the file 
if((fp = fopen(argv[1], "rb"))== NULL) 
{ 
    printf("\nError: Unable to open the file.\n"); 
    return 2; 
} 

i=0; 
while((ch = fgetc(fp))!=EOF) 
{ 
    //check for the range 
    if(ch>=32 && ch<=126) 
    { 
     buf[i] = ch; i++; 

     //This loop will run till it find a next unprintable character (not between the range of 32 and 126 
     //we also check for the EOF while reading the characters 
     while(((ch = fgetc(fp))>=32 && ch<=126) && ch!=EOF) 
     { 
      buf[i] = ch; i++; 
     } 
     buf[i] = '\0'; //adding the NULL character 

     //if the string is at least of 4 letters, print it 
     if(i>=4) 
     printf("\n%s", buf); 

     //reset the counter 
     i=0; 

    } 

} 
fclose(fp); 

return 0; 

}

File contents - test.txt, that I used: 
--------------------------------------------------------------- 
This is a string 
anotherline of text #$%#$%#$% #$% #$%345#$$%&$&@#$!##~######@ 
!∞▬345345µ∞#452353453$%@#$%#$%$%%^&%^*4234346443754754451}  

,這是該程序的輸出: C:\用戶\閃耀\文件\ MYCPROGS \ forStackoverflow> printchar的test.txt

This is a string 
anotherline of text #$%#$%#$% #$% #$%345#$$%&$&@#$!##~######@ 
345#$%@#$%@#452353453$%@#$%#$%$%%^&%^*4234346443754754451} 
345345 
------------------------------------------------------------------- 

希望這會有所幫助。我做這個很匆忙,所以如果你發現有什麼問題,請告訴我。每次

+0

我看了這個,它應該在大多數情況下工作。然而,假設讀入的字符串有連續7個字符的連續條紋。然後下一個字符串只有4條。前一個字符串的最後3個字符仍然會出現在'buf'我的想法中。如果你明白我的意思。 – user3268401

+0

哦,是的,謝謝你指出。你可以添加另一行代碼來清空數組,像這樣buf [0] ='\ 0';在i = 0之後; –

0

讀一個字,寫的時候,我們找到足夠長字符串或必須:

#include <ctype.h> 
#include <stdio.h> 
#include <stdlib.h> 

int 
main(int argc, char *argv[]) 
{ 
    size_t min_str_len = 4; 
    size_t buf_len = 4; /* Must greater than or equal to min_str_len */ 
    char buf[buf_len], ch; 
    size_t out_len, last_len; 

    last_len = out_len = 0; 
    while (fread(&ch, 1, 1, stdin) > 0) { 
     if (isprint(ch)) { 
      buf[out_len++] = ch; 
      if (out_len >= buf_len) { 
       fwrite(buf, 1, out_len, stdout); 
       last_len += out_len; 
       out_len = 0; 
      } 
     } 
     else { 
      if (out_len + last_len >= min_str_len) { 
       fwrite(buf, 1, out_len, stdout); 
#ifdef NEWLINE 
       fwrite("\n", 1, 1, stdout); 
#endif 
       last_len = out_len = 0; 
      } 
      else { 
       out_len = 0; 
      } 
     } 
    } 

    exit(EXIT_SUCCESS); 
} 

如果你想每次讀取多個字節,這種「至少4個連續打印字符「將使它有點棘手:

#include <assert.h> 
#include <ctype.h> 
#include <stdio.h> 
#include <stdlib.h> 

int 
main(int argc, char *argv[]) 
{ 
    size_t str_min_len = 4; 
    size_t buf_len = 1024; /* Must greater than or equal to str_min_len */ 
    char in_buf[buf_len], out_buf[buf_len]; 
    size_t out_len, in_len, last_len; 

    last_len = out_len = 0; 
    while ((in_len = fread(in_buf, 1, buf_len, stdin)) > 0) { 
     assert(out_len == 0); 
     for (size_t i = 0; i < in_len; i++) { 
      char ch = in_buf[i]; 
      if (isprint(ch)) { 
       out_buf[out_len++] = ch; 
      } 
      else { 
       if (out_len + last_len >= str_min_len) { 
        fwrite(out_buf, 1, out_len, stdout); 
#ifdef NEWLINE 
        /* Write a newline between strings. */ 
        fwrite("\n", 1, 1, stdout); 
#endif 
        last_len = 0; 
       } 
       out_len = 0; 
      } 
     } 

     if (0 < out_len && out_len < str_min_len) { 
      size_t pad_len = str_min_len - out_len; 
      for (size_t i = 0; i < pad_len; i++) { 
       char ch; 
       if (fread(&ch, 1, 1, stdin) < 1) { 
        exit(EXIT_SUCCESS); 
       } 
       else if (isprint(ch)) { 
        out_buf[out_len++] = ch; 
       } 
       else { 
        break; 
       } 
      } 
     } 

     if (out_len >= str_min_len) { 
      fwrite(out_buf, 1, out_len, stdout); 
      last_len = out_len; 
      out_len = 0; 
     } 
     else { 
      last_len = out_len = 0; 
     } 
    } 

    exit(EXIT_SUCCESS); 
} 
相關問題