我得到了一个txt文件,如下所示:
T,G,F,F
G,T,T,F
G,T,F,G
T,F,G,T
二聚体=4
我想把它导入数组,作为动态分配字符,比如:[T,G,F,F,G,T,T,F,G,T,F,G,T,F,G,T]
我试了一遍代码,但还是出错了。
void file_2_arr(FILE *file,char *forest_current,int dimen)
{
int i = 0;
char *buffer = NULL;
buffer =(char*)malloc(sizeof(char) * (2*dimen-1));
const char* delim = ",";
while (!feof(file))
{
fgets(buffer, sizeof buffer, file);
char* token = strtok(buffer, delim);
while (token != NULL)
{
printf("%s", token);
strcpy(forest_current, token);
token = strtok(NULL, delim);
forest_current++;
}
}
free(buffer);
return;
您的函数太复杂了。您正在调用5个函数,而实际上只需要调用一个。
你正在做:
fgets(buffer, sizeof buffer, file);
但是,sizeof
将返回指针的大小和,而不是您分配的长度。您想要:
fgets(buffer, 2 * dimen - 1, file);
但是,2 * dimen - 1
太短了。它不考虑行末尾的换行符[或EOS字符]。因此,对于fgets
和malloc
,都需要将其更改为2 * dimen + 2
另外,不要使用feof
。只需检查fgets
的返回值
您正在使用strtok
一次去掉单个字符。这是非常缓慢的。
注意,根据定义,sizeof(char)
总是1。所以,消除它。
不清楚是否希望输出缓冲区末端有EOS字符。但是,你得到了一个。
此外,没有显示调用函数的代码,那么如何确保调用者的缓冲区中有足够的空间呢?
您实际上并没有指定您实际遇到的错误,因此很难确保以上内容解决您的问题。
而且,没有必要铸造malloc的回归。请参阅:我是否投射malloc的结果?
如果一次读取一个字符,则不需要使用malloc
或单独的缓冲区。或者,任何其他功能。
#include <stdio.h>
void
file_2_arr(FILE *file, char *forest_current, int dimen)
{
while (1) {
int chr = fgetc(file);
if (chr == EOF)
break;
switch (chr) {
case ',':
case 'n':
break;
default:
*forest_current++ = chr;
break;
}
}
#if 0
*forest_current = 0;
#endif
}