2014-10-17 96 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

相关问题