2014-10-17 91 views
0

得到一個奇怪的輸出,所以我有一個方法,將字符串從文件移動到c中的字符數組,但是當我嘗試打印出來時,我得到奇怪的輸出在終端,看起來像一堆每個字符點,每個盒子都有4個0和1個。c程序正在編譯和運行,但我在終端

這裏是我的代碼:

int main(int argc, char** argv){ 
      if(argc != 3){ 
        printf("not valid # of arguments"); 
        return 1; 
      } 
      struct stat info; 
      int status; 
      status = stat(argv[2], &info); 

      if(status != 0){ 
        printf("Error, errno = %d\n", errno); 
        return 1; 
      } 
      //command line argument is file 
      if(S_ISREG (info.st_mode)){ 
        printf("%s is a file \n", argv[2]); 
        char *string1; 
        string1 = getFileString(argv[2]); 
        printf("string in file is %s \n", string1); 
        free(string1); 
        return 0; 
      } 
      if(S_ISDIR(info.st_mode)){ 
        printf("%s is a directory \n", argv[2]); 
        openDirRec(argv[2]); 
        //what to do if command line argument is directory 
      } 
      return 0; 


    } 
    char* getFileString(char *fileName){ 
     FILE* qp; 
     qp = fopen(fileName, "r"); 
     char ch; 
     struct stat st; 
     if(stat(fileName, &st) != 0) { 
     return NULL; 
     } 
     /*int sizeCheck = 0; 
     while((ch=fgetc(qp))!=EOF){ 
       sizeCheck++; 
     } 
     */ 
     int sizeCheck = st.st_size; 
     if(sizeCheck == 0){ 
       return NULL; 
     } 
     else{ 
       //fseek(qp, SEEK_SET, 0); 
       char *fileString; 
       fileString = (char*)malloc(sizeof(char) * sizeCheck + 1); 
       memset(fileString, 0, sizeCheck + 1); 
       //rewind(qp); 
       int count = 0; 
       while((ch=fgetc(qp)!=EOF)){ 
         fileString[count] = ch; 
         count++; 
       } 
       printf("%s\n", fileString); 
       fileString[sizeCheck] = '\0'; 
       fclose(qp); 
       return fileString; 

} 
} 
+2

'sizeof(char)'被定義爲'1';沒有意義乘以它。另外,* always *檢查'malloc'的結果是否爲'NULL'。另外,'stat'已經告訴你文件的大小;你的'sizeCheck ++'循環是非常低效和不必要的。另外,看看'fread';爲每個角色調用'fgetc'也是低效的。另外,您可能希望'NUL'-在打印之前終止您的字符串*。另外,你是否確定你的文件只有ASCII字符?另外,現在學習如何使用調試器的時間已經不錯了。 – 2014-10-17 03:29:01

+0

這可以導致一個關閉,fileString [sizeCheck + 1] ='\ 0'; ? – 2014-10-17 03:42:08

+0

@JonathonReinhart是的我使用gdb,當我修改我的代碼之前檢查gdb的第一個循環計數與實際閱讀的字符,我擺脫了這一點,並使用stat結構,並得到了這樣的大小,但所有的字符將字符放在數組中的循環顯示爲'\ 001'並且它仍然輸出相同的東西 – atg963 2014-10-17 03:43:33

回答

2

此行是罪魁禍首。

  while((ch=fgetc(qp)!=EOF)) 

由於運算符優先級,即相當於:

  while(ch = (fgetc(qp)!=EOF)) 

你所需要的是括號中一點點重排。

  while((ch=fgetc(qp)) != EOF) 
+0

你說得對,它現在完美了!我不敢相信我花了數小時,因爲這非常感謝你! – atg963 2014-10-17 03:52:21

+0

不客氣。很高興我能夠提供幫助。 – 2014-10-17 03:53:18