2017-09-19 54 views
-1
char *arr[512][lineCount]; 
while(lineCount > 0){  
    char *savedLine = malloc(512); 
    while(1){ 
    fread(savedLine, 1, 1,fd); 
    if(savedLine != '\n'){ 
     arr = savedLine; 
    }else{ 
     break; 
    } 
    }lineCount --; 
} 

所以我试图创建一个逐行存储字符的2D字符数组。 我不允许使用fgets,因此我一次使用fread存储一个字符,直到达到'\n'。但它不会编译,说我无法比较指针和整数(savedLine != 'n'),并且数组类型不可分配(char *arr[512][lineCount])。其余的变量在我的代码中声明。如何使用fread将char保存到我的二维数组?

+0

这些尺寸看起来特别混乱。这不应该是char指针数组的数组。如果有的话它应该是指向char的VLA。也就是说,我首先将'char * arr [512] [lineCount];'改成'char * arr [lineCount];'。我也有一个升序计数器,从零开始,在建立你的列表的同时对'arr'进行索引。最后,[fgets](http://en.cppreference.com/w/c/io/fgets)可能更适合每行工作。 – WhozCraig

+0

启用编译器警告.'savedLine!='\ n''应警告以及其他人:比较指针与字符常量。 – chux

回答

1

您没有二维数组字符,您有二维数组指针,并且您从未将任何内容指定给这些指针。但是你根本不需要指针。只需声明一个char变量并将其读入其地址,然后将其复制到数组中。

char arr[lineCount][512]; 
int pos = 0; 
while (lineCount > 0) { 
    char tempChar; 
    size_t n = fread(&tempChar, 1, 1, fd); 
    if (n == 0) { // EOF or error 
     break; 
    } 
    if (tempChar == '\n') { 
     arr[lineCount-1][pos] = '\0'; // Add trailing null to current line 
     lineCount--; // Start new line 
     pos = 0; 
    } else { 
     arr[lineCount-1][pos] = tempChar; 
     pos++; 
     if (pos == 511) { // Filled up current line, start new line 
      arr[lineCount-1][pos] = '\0'; 
      lineCount--; 
      pos = 0; 
     } 
    } 
} 

注意,需要从lineCount减去1分配给数组的时候,因为阵列索引从0到size-1。另请注意,您已向后声明了该数组。

+0

不记录每个'arr []'的使用量。也许在结束,如果行EOF的''\ 0'? – chux

+0

非常感谢你的工作! – geronimo

+0

@chux谢谢,解决了。 – Barmar

相关问题