0

我在 C 中创建了这段代码,以逐行读取文本文件并将每一行存储到数组的位置:

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

static const int MAX_NUMBER_OF_LINES = 100000;
static const char filename[] = "file.csv";

int main ( void )
{

  // Read file and fill the Array
  char *myArray[MAX_NUMBER_OF_LINES];
  int numberLine = 0;
  FILE *file = fopen (filename, "r");
  if (file != NULL)
  {
      char line [128];
      while (fgets (line, sizeof line, file) != NULL)
      {
          myArray[numberLine] = line;
          numberLine++;    
      }
      fclose (file);
  }

  // Print the Array
  for (int i = 0; i<numberLine; i++)
  {
    printf("%d|%s", i, myArray[i]);
  }
}

但是在打印数组时,它是空的。我究竟做错了什么?

4

3 回答 3

4

因为您需要将这些行复制到数组中的缓冲区中。

您需要为数组的每个元素中的字符串分配空间,然后使用类似的东西strncpy将每个元素移动line到每个myArray插槽中。

在您当前的代码中,您只是将相同的引用 - 到您的line缓冲区 - 复制到每个数组插槽中,因此最后,每个插槽myArray应该指向内存中的相同字符串。

根据 Shoaib 的建议,如果可用 strdup 将保存一个步骤,因此请尝试:

myArray[i] = strdup(line);

那里没有错误处理,请参阅strncpystrdup的文档。

或者,您可以只添加一个维度myArray

char myArray[MAX_NUMBER_OF_LINES][100];
于 2012-06-10T20:21:44.377 回答
1

您需要真正为所有字符串分配空间,而不仅仅是为指向不存在的字符串的指针。在您的示例中,所有分配的指针都指向变量,这超出了范围。

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

static const int MAX_NUMBER_OF_LINES = 100000;
static const int MAX_LINE_LENGTH = 127;
static const char filename[] = "file.csv";

int main ( void )
{

  // Read file and fill the Array
  char myArray[MAX_NUMBER_OF_LINES][MAX_LINE_LENGTH + 1 /* for 0 byte at end of string */];
  int numberLine = 0;
  FILE *file = fopen (filename, "r");
  if (file != NULL)
  {
      while (fgets (myArray[numberLine], MAX_LINE_LENGTH + 1, file) != NULL)
      {
          numberLine++;    
      }
      fclose (file);
  }

  // Print the Array
  for (int i = 0; i<numberLine; i++)
  {
    printf("%d|%s", i, myArray[i]);
  }
}
于 2012-06-10T20:26:47.417 回答
1

char* 数组指向行 chararray,但您应该将每一行保存在一个数组中并将 myArray[numberLine] 指向它:


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

static const int MAX_NUMBER_OF_LINES = 100000;
static const char filename[] = "file.csv";

int main ( void )
{

  // Read file and fill the Array
  char *myArray[MAX_NUMBER_OF_LINES];
  int numberLine = 0;
  FILE *file = fopen (filename, "r");
  if (file != NULL)
  {
      char line [128];
      while (fgets (line, sizeof line, file) != NULL)
      {
          //refinement is hre
          myArray[numberLine] = (char*)malloc(sizeof line);
          strcpy(myArray[numberLine], line);
          numberLine++;    
      }
      fclose (file);
  }

  // Print the Array
  for (int i = 0; i<numberLine; i++)
  {
    printf("%d|%s", i, myArray[i]);
    free(myArray[i])

  }
}
于 2012-06-10T20:29:33.313 回答