0

テキスト ファイルを 1 行ずつ読み取り、各行を配列の位置に格納するために、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に移動する必要があります。linemyArray

現在のコードでは、同じ参照(lineバッファへ)を各配列スロットにコピーしているだけなので、最後に、の各スロットはmyArrayメモリ内の同じ文字列を指している必要があります。

Shoaibの提案によると、strdupは、利用可能な場合はステップを節約するので、次のことを試してください。

myArray[i] = strdup(line);

そこではエラー処理はありません。strncpyとstrdupのドキュメントを参照ください

または、次の場所にディメンションを追加することもできます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 に答える