将char数组转换为读取文件的两倍

时间:2015-10-08 01:48:55

标签: c arrays char double

所以我正在读一个用空格分隔的数字文件,我试图将这些数字存储到一个整数数组中。我做错了,因为我只是在数组中得到零。

int main(int argc, char *argv[]){
    FILE *param;
    char temps[500];
    double holder[500];

    param = fopen(argv[1],"r");
    int u = 0;
    while ((temps[u] = fgetc(param)) != EOF)
        u++;
    char *pch;
    int v = 0;
    pch = strtok(temps," ");
    while (pch != NULL) {
        holder[v] = atof(pch);
        pch = strtok(NULL," ");
        v++;
    }
}

2 个答案:

答案 0 :(得分:1)

您需要nul终止数组,使其成为中的字符串。

while ((temps[u] = fgetc(param)) != EOF)
        u++;
temps[u] = '\0';

没有这样做并且将temps传递给strtok()会调用未定义的行为,并且由于它未定义,因此无法解释程序的行为。

您还应该:

  1. 在尝试访问argc之前检查argv的值。
  2. 检查fopen()
  3. 的返回值
  4. 另外,fgetc()会返回int而非char,因此EOF会导致您的代码出现问题,除此之外您还不会#39; t EOF无论如何都要在数组中。
  5. 为清晰起见,请避免将声明与代码混合使用。
  6. 这是你自己的程序修复,它应该正常工作

    1. 输入文件退出并可读。
    2. 输入文件包含适当的数据。
    3. int main(int argc, char **argv)
      {
          FILE *param;
          char temps[500];
          double holder[500];
          int u;
          char *pch;
          int ch;
          int v;
      
          if (argc < 2)
          {
              fprintf(stderr, "Invalid number of arguments, a file path is expected.\n");
              return -1;
          }
      
          param = fopen(argv[1],"r");
          if (param == NULL)
          {
              fprintf(stderr, "error trying to open `%s'\n", argv[1]);
              return -1;
          }
      
          u = 0;
          while ((ch = fgetc(param)) != EOF)
              temps[u++] = ch;
          temps[u] = '\0';
      
          v = 0;
          pch = strtok(temps, " ");
          while (pch != NULL)
          {
              char *endptr;
              holder[v] = strtol(pch, &endptr, 0);
              if (*endptr != 0)
                  fprintf("warning: these characters were not convetible -- %s\n", endptr);
              pch = strtok(NULL, " ");
      
              v++;
          }
      }
      

答案 1 :(得分:1)

您还可以使用fscanf在单个循环中读取double值。不知道正确的分离应该在这里,所以使用空间。

while ((ch = fscanf(param,"%lf ", &holder[v] )) != EOF)
    v++;