在C中读取文本文件并将值分配给数组时出错

时间:2015-03-22 23:00:38

标签: 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));

   return 0;
}

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

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

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

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

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

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++;
    }
  }
return count;
}

我已经测试了最后两个辅助函数getRow和getCol是否正常工作,并返回nRow = 5和nCol = 3的值。我只是将它们保留在这里以防它可能导致错误(我怀疑)。错误似乎来自第一个辅助函数assignX。以下是我运行时的错误:

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

错误:

readReg.c: In function ‘assignX’:
readReg.c:52: warning: passing argument 1 of ‘fgets’ from incompatible pointer type
/usr/include/stdio.h:626: note: expected ‘char * __restrict__’ but argument is of type ‘struct FILE *’
readReg.c:52: error: too few arguments to function ‘fgets’
readReg.c:54: 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 :(得分:1)

问题数量

  1. 使用char *string; ... while(!feof(f)){ string = fgets(f);代替char string[1000]; while(fgets(string, sizeof string, f) != NULL) {。学习者代码很少使用feof()。请改为检查fgets()返回值。

  2. int getRow(char *fileName)会打开,但不会关闭f。添加fclose(f)

  3. main()似乎只读取该文件的一行。

  4. 还有更多,但GTG

答案 1 :(得分:0)

还有其他一些问题,但由于这一行,编译器失败了:

string = fgets(f); 

fgets不能以这种方式调用,因为有missing arguments

char * fgets (char *s, int count, FILE *stream)

编译器抱怨的另一个错误是你的assignX函数中的这一行:

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

您的主要声明中有此声明:

double *X;

在调用strcpy时,您需要关注this模板:

char * strcpy (char *restrict to, const char *restrict from)

此外,你声明了你的X to be a pointer not an array,所以试图访问X [i]会导致任何类型的错误:未定义的行为(如果你在允许你访问内存位置的上下文中)在与X)相同的块中,在编译时出现分段错误和失败。

  

数组声明char a [6]请求留出六个字符的空格,以名称a''. That is, there is a location named a&#39;&#39;可以坐六个角色。另一方面,指针声明char * p请求一个包含指针的地方,名称为“p&#39;&#39;”。这个指针几乎可以指向任何字符:任何字符,或任何连续的字符数组,或无处

答案 2 :(得分:-1)

我认为您忘记添加fstream标题。

  

#include fstream.h

我是对的吗?