如何在C中向double数组添加值

时间:2015-03-23 21:15:05

标签: c arrays pointers io

我之前写了一个类似的问题。但是,我有一个我现在无法解决的错误。

我正在尝试用C编写代码,这样如果我有一个文件reg2.dat:

5.1 3.5 1.4
4.9 3 1.4
4.7 3.2 1.3
4.6 3.1 1.5
5 3.6 1.4

然后,我可以1)确定行数(在这种情况下为5),2)确定列数(在本例中为3),3)在双数组X中写入所有15个值。

我的代码是为前两个目标而工作的。但是,我不能让双数组X包含值(5.1,3.5,1.4,4.9,3,1.4,4.7,3.2,1.3,4.6,3.1,1.5,5,3.6,1.4)。我被困在这一个星期,并得到了建议,但不幸的是仍然需要更多的直接帮助:(

以下是我完整且有序的代码:

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

int getCol(char *myStr);
int getRow(char *fileName);
int assignX(int nCol, int nRow, double *X, char *fileName);

int main(){
   FILE *f;
   char myStr[1000];
   int strL;
   int nCol;
   int nRow;
   char *fileName = "reg2.dat";
   double *X;

   f = fopen(fileName, "r");
   if (f == NULL) perror ("Error opening file");
   else {
     if (fgets(myStr, 1000, f) != NULL )
       puts(myStr);
     fclose(f);
   }

   strL = strlen(myStr);
   nCol = getCol(myStr);
   nRow = getRow(fileName);
   printf("Sample size and number of predictors are %d and %d respectively.\n", nRow, nCol-1);

   X = (double *) malloc(sizeof(double) * (nRow* nCol));
   assignX(int nCol, int nRow, double *X, char *fileName);
   return 0;
}

不起作用的辅助函数遵循......

int assignX(int nCol, int nRow, double *X, char *fileName){
  int i=0;
  int j;
  char string[1000];
  FILE *f;
  f = fopen(fileName, "r");

  while(fgets(string, sizeof string, f) != NULL){
    for (j=0; j<nCol; j++){
       strcpy(X[i], strtok(string, " "));
       i++;
    }  
  }

  for (i=0;i<(nRow*nCol);i++){
    printf("%d\n", X[i]);
  }
  return 0;
}  

有效的辅助函数遵循......

int getCol(char *myStr){
    int length,i,count=0;
    char prev;
    length=strlen(myStr);
    if(length > 0){
      prev = myStr[0];
    }
    for(i=0; i<=length; i++){
      if(myStr[i]==' ' && prev != ' '){
        count++;
      }
      prev = myStr[i];
    }
    if(count > 0 && myStr[i] != ' '){
        count++;
    }
    return count;
}

int getRow(char *fileName){
  char ch;
  int count=0;
  FILE *f;
  f = fopen(fileName, "r");

  while(!feof(f)){
    ch = fgetc(f);
    if(ch == '\n')
    {
      count++;
    }
  }
fclose(f);
return count;
}

运行时出现错误:

gcc -ansi -pedantic readReg.c -o readReg -llapack -lblas -lgfortran

错误:

readReg.c: In function ‘main’:
readReg.c:40: error: expected expression before ‘int’
readReg.c: In function ‘assignX’:
readReg.c:55: error: incompatible type for argument 1 of ‘strcpy’
/usr/include/string.h:128: note: expected ‘char * __restrict__’ but argument is of type ‘double’

3 个答案:

答案 0 :(得分:0)

您是否尝试使用atof代替strcpychar *值转换为double值?

我的意思是改变这个 strcpy(X[i], strtok(string, " "));

到此 X[i] = atof(strtok(string, " "));

这里有一个例子 http://www.tutorialspoint.com/c_standard_library/c_function_atof.htm

更新:

这里有AssignX功能(文件 reg2.dat 中的最后一行必须输入(\n),如果最后一行没有输入程序将崩溃,因为行号将是4而不是5.我建议你检测到这种情况,以避免程序崩溃:D)

int assignX(int nCol, int nRow, double *X, char *fileName){
  int i=0;
  int j;
  char string[1000];
  char* data = NULL;
  FILE *f;
  f = fopen(fileName, "r");

  while(fgets(string, sizeof(string), f) != NULL){
    data = strtok(string, " ");
    for (j=0; NULL != data && j<nCol; j++){
        if (data[strlen(data) - 1] == '\n')
            data[strlen(data) - 1] = '\0';
        X[i] = atof(data);
        data = strtok(NULL, " ");
       i++;
    } 
  }  

  for (i=0;i<(nRow*nCol);i++){
    printf("%f\n", X[i]);
  }
  return 0;
}  

希望这有帮助

答案 1 :(得分:0)

编译告诉你,这一行是错误的:

strcpy(X[i], strtok(string, " "));

就语法而言,strcpy的第一个参数必须是char*X[i]不是char*

就功能而言,这不是从字符串中提取double的方式。您需要使用atofsscanf

这是一个应该有效的更新循环:

// Declare this at the start of the function.
char* token;

...

while(fgets(string, sizeof string, f) != NULL)
{
   // Use string to start the call to strtok.
   token = strtok(string, " ");

   // Even though each row should have nCol, be safe
   // and make sure that you don't process token if
   // it is NULL.
   for ( j = 0; j < nCol && token != NULL; j++)
   {
      X[i] = atof(token);
      i++;

      // For subsequent calls to strtok, use NULL
      // for the first argument.
      token = strtok(NULL, " ");
   }  
}

答案 2 :(得分:0)

你可以这样做,这应该会导致文件中的双打数组:

  int assignX(double *X, char *fileName){
  int i=0;
  FILE *f;
  f = fopen(fileName, "r");

  while(fscanf(f, "%lf", &(X[i])) != EOF) 
       i++; 
  }