我在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]);
}
}
但是在打印数组时,它是空的。我做错了什么?
答案 0 :(得分:4)
因为您需要将行复制到数组中的缓冲区中。
您需要为数组的每个元素中的字符串分配空间,然后使用strncpy
之类的内容将每个line
移动到每个myArray
插槽中。
在您当前的代码中,您只是将相同的引用 - 您的line
缓冲区复制到每个数组插槽中,因此最后,myArray
的每个插槽应指向相同的字符串在记忆中。
根据Shoaib的建议,如果可用,strdup将保存一步,请尝试:
myArray[i] = strdup(line);
此处没有错误处理,请参阅strncpy和strdup的文档。
或者,您只需向myArray
添加维度:
char myArray[MAX_NUMBER_OF_LINES][100];
答案 1 :(得分: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]);
}
}
答案 2 :(得分: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])
}
}