将.txt文件传输到malloc分配的动态内存
所以,我已经在StackOverflow上搜索了一段时间,但是没有一篇半相关的文章可以解决我的问题,所以我希望任何人都能帮我:) 所以我想做的是传输一个.txt文件,上面有以下内容:将.txt文件传输到malloc分配的动态内存,c,memory,allocation,C,Memory,Allocation,所以,我已经在StackOverflow上搜索了一段时间,但是没有一篇半相关的文章可以解决我的问题,所以我希望任何人都能帮我:) 所以我想做的是传输一个.txt文件,上面有以下内容: 1 5 8 2 4 6 9 5 7 (每个示例) 所以,我想知道的是: 如何使用malloc将.txt传输到分配的内存 我必须分别读取每一行并提取数字,然后将ID为的结构的内容与.txt文件中的数字进行比较 如果我将.txt的内容传输到数组中(使用malloc),数组中是否仍有“\n”,以便我可以区分行 由
1 5 8
2 4 6 9
5 7
(每个示例)
所以,我想知道的是:
由于值从
1
到9
,您可以使用0
作为每行的哨兵,这样您就不需要预测或存储每行中的数字数量,您只需存储出现的所有数字,并在末尾添加一个0
,这将帮助您知道数字的结尾,与c处理字符串的方式相同
下面的代码就是我描述的
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int
appendvalue(int ***values, int row, int column, int value)
{
void *pointer;
pointer = realloc(values[0][row], (1 + column) * sizeof(int));
if (pointer == NULL)
{
fprintf(stderr, "warning: allocating memory\n");
return 0;
}
values[0][row] = pointer;
values[0][row][column] = value;
return 1 + column;
}
int
main(void)
{
FILE *file;
char buffer[100];
char *line;
int **values;
int row;
file = fopen("input.txt", "r");
if (file == NULL)
{
fprintf(stderr, "error opening the file\n");
return -1;
}
values = NULL;
row = 0;
while ((line = fgets(buffer, sizeof(buffer), file)) != NULL)
{
void *pointer;
size_t column;
while (isspace(*line) != 0)
line++;
if (*line == '\0') /* empty line -- skip */
continue;
pointer = realloc(values, (row + 1) * sizeof(int *));
if (pointer == NULL)
{
fprintf(stderr, "error allocating memory\n");
return -1;
}
values = pointer;
values[row] = NULL;
column = 0;
while ((*line != '\0') && (*line != '\n'))
{
if (isspace(*line) == 0)
column = appendvalue(&values, row, column, *line - '0');
++line;
}
column = appendvalue(&values, row, column, 0);
row += 1;
}
/* let's print each row to check */
for (--row ; row >= 0 ; --row)
{
size_t index;
for (index = 0 ; values[row][index] != 0 ; ++index)
{
printf("%d, ", values[row][index]);
}
printf("\n");
free(values[row]);
}
free(values);
return 0;
}
#包括
#包括
#包括
int
appendvalue(int***值、int行、int列、int值)
{
void*指针;
指针=realloc(值[0][row],(1+列)*sizeof(int));
if(指针==NULL)
{
fprintf(stderr,“警告:正在分配内存”);
返回0;
}
值[0][行]=指针;
值[0][行][列]=值;
返回1+列;
}
int
主(空)
{
文件*文件;
字符缓冲区[100];
字符*行;
整数**值;
int行;
file=fopen(“input.txt”,“r”);
if(file==NULL)
{
fprintf(stderr,“打开文件时出错”);
返回-1;
}
值=空;
行=0;
而((line=fgets(buffer,sizeof(buffer),file))!=NULL)
{
void*指针;
柱体尺寸;
而(isspace(*行)!=0)
line++;
如果(*line=='\0')/*空行--跳过*/
持续
指针=realloc(值,(行+1)*sizeof(int*);
if(指针==NULL)
{
fprintf(stderr,“分配内存时出错”);
返回-1;
}
值=指针;
值[行]=空;
列=0;
而((*line!='\0')&&(*line!='\n'))
{
如果(isspace(*行)==0)
column=appendvalue(&values,行,列,*行-'0');
++线路;
}
column=appendvalue(&values,行,列,0);
行+=1;
}
/*让我们打印每一行以进行检查*/
对于(--row;row>=0;--row)
{
尺寸指数;
对于(索引=0;值[行][索引]!=0;++索引)
{
printf(“%d”),值[行][索引];
}
printf(“\n”);
自由(值[行]);
}
自由(价值观);
返回0;
}
显然,fgets()
+strtol()
组合将非常适合此任务。文件是否像示例中那样不规则?我的意思是,每一行包含不同数量的值?我想要每一行的分离值,例如:1,5和8,对于第1行,strtol会在字符串上放置158吗?因为如果是这样的话,那会有帮助的。但是我怎么才能转到下一行呢?顺便说一下,谢谢,是的。带有值的文件是随机生成的,每行至少有2个值,我可以保证记录中不会有超过9的值。什么?你是说每一行都是一个数字?数字之间用空格隔开?不,第1行有三个数字:1、5和8。我需要把它们分开。但是,如果strtol将值158放在一个字符串上,我可以单独得到数字。你能说一下预期的文件大小吗?问题是,我不能更改生成文件的代码,所以我不能将0放在行结束的地方。0
将放在读取文件的代码中,即上面的代码,它被放置在您分配的堆空间中,您可以使用realloc()
测试代码,告诉我它是否符合您的需要,尝试理解打印数字的部分,Y asívas a entender bien como usar el arreglovalue
。哦,我明白了,我要尝试一下,我会告诉您一些事情,非常感谢您的时间,耐心和知识:]你能解释一下你在代码的最后部分做了什么吗?我以为你把所有的值都放到了一个矩阵中,但我有点困惑,特别是在变量“index”部分。这些值在一个有[row]行的矩阵中,但我不太了解索引部分,抱歉:c,我还是新手c@DanielFernandes它不是一个矩阵,它是一种不同类型的容器,最后一部分是容器的“行”,但每一行都有不同数量的项目,所以你扫描项目直到项目[索引]==0
条件满足,因为这意味着没有更多的项目。