我怎么会去了解动态分配内存为char **在这个函数列表?
基本上这个项目的想法是我从文件中的单词列表读取。 我不能假设最大字符串或最大字符串长度。
我必须做其他的东西与C字符串,但这些东西我应该工作正常。
谢谢!
void readFileAndReplace(int argc, char** argv)
{
FILE *myFile;
char** list;
char c;
int wordLine = 0, counter = 0, i;
int maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0;
myFile = fopen(argv[1], "r");
if(!myFile)
{
printf("No such file or directory\n");
exit(EXIT_FAILURE);
}
while((c = fgetc(myFile)) !=EOF)
{
numberOfChars++;
if(c == '\n')
{
if(maxNumberOfChars < numberOfChars)
maxNumberOfChars += numberOfChars + 1;
numberOfLines++;
}
}
list = malloc(sizeof(char*)*numberOfLines);
for(i = 0; i < wordLine ; i++)
list[i] = malloc(sizeof(char)*maxNumberOfChars);
while((c = fgetc(myFile)) != EOF)
{
if(c == '\n' && counter > 0)
{
list[wordLine][counter] = '\0';
wordLine++;
counter = 0;
}
else if(c != '\n')
{
list[wordLine][counter] = c;
counter++;
}
}
}
这样做:
char** list;
list = malloc(sizeof(char*)*number_of_row);
for(i=0;i<number_of_row; i++)
list[i] = malloc(sizeof(char)*number_of_col);
此外,如果您是动态分配内存。 你释放它为完成工作:
for(i=0;i<number_of_row; i++)
free(list[i] );
free(list);
编辑
在你修改后的问题:
int wordLine = 0, counter = 0, i;
wordLine
和counter
是0
在此之前的代码:
list = malloc(sizeof(char*)*wordLine+1);
for(i = 0;i < wordLine ; i++)
list[i] = malloc(sizeof(char)*counter);
你必须赋值给wordLine
和counter
变量
还内存分配应该是以下循环(外)前:
while((c = fgetc(myFile)) != EOF){
:
:
}
编辑 :
新的第三个版本问题。 您正在阅读的文件两次。 所以,你需要FSEEK(),快退()到第一个字符的第二循环开始之前。
尝试:
fseek(fp, 0, SEEK_SET); // same as rewind()
rewind(fp); // same as fseek(fp, 0, SEEK_SET)
我也有疑问,在你的逻辑来计算numberOfLines
和maxNumberOfChars
。 请检查还
编辑
我觉得你的计算maxNumberOfChars = 0, numberOfLines = 0
是尝试这样的错误:
maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0;
while((c = fgetc(myFile)) !=EOF){
if(c == '\n'){
numberOfLines++;
if(maxNumberOfChars < numberOfChars)
maxNumberOfChars = numberOfChars;
numberOfChars=0
}
numberOfChars++;
}
maxNumberOfChars
是在一行字符的最大数量。
同时更改代码:
malloc(sizeof(char)*(maxNumberOfChars + 1));
如果我是你,我会映射文件的私有内存,使用mmap
,然后遍历文件,存储的话开始在数组char**
,你可以增加,因为你去realloc
和替换换行符与0。
这样的话,你必须在内存中连续的块你的话,你不必关心文件I / O,因为你必须在内存中的整个文本文件char*
,而不必对malloc数组的阵列。
有关功能方面的信息,请参见相应的手册页,或请给我留言:)
编辑:如果你不知道的mmap呢,看看这个: http://www.jimscode.ca/index.php/component/content/article/13-c/45-c-simple-mmap-example
今天大多数C程序员仍然试图读取使用文件加载到内存fopen
和朋友,但这是完全没有必要的,并引入了复杂的additionel水平。 (缓冲,越来越多的阵列,...)和mmap
是一个很好的替代方案,将所有的肮脏的工作下到OS