我有一个.csv文件的字段要读取为整数,字符串,整数。我不知道字符串的大小,它们可能会因csv中的不同条目而异。例如:
log.error("AccessToken: " + securityContext.getTokenString());
log.error("User: {} / {}", accessToken.getPreferredUsername(), accessToken.getName());
log.error("Principal: {}", principal.getName());
这里1,Hello,10
2,hi,20
和Hello
的长度不同,那么如何使用malloc从文件中读取时动态分配字符串的大小?
任何人都可以帮助我使用它的语法,从声明开始直到使用malloc来分配大小。
我的输出应该是这样的,它是从.csvfile读取整数,字符串,整数并显示文件中的所有字符串。
文件中的条目数量可以达到数千万。
答案 0 :(得分:0)
有很多方法可以解决这个问题。一般的想法是设置缓冲区的最大存储量。如果你不知道,你会做什么?
我可以告诉你一个简单的想法,你用一些BUFFERSIZE
创建一个缓冲区。现在,当逐个字符地阅读时,您将知道何时90%的缓冲区已满。当发生这种情况时,你需要重新分配并加倍内存。这样你就会有足够的记忆力。
另一种方法是逐个处理。而是存储整个大块然后处理它,分割它并完成工作,然后读取下一个块。这样你就不会立刻使用太多的内存。
大多数大型数据处理C库遵循此处所述的类似想法。
答案 1 :(得分:0)
使用strtok()和strlen()的组合。
首先,请记住,您不需要为令牌分配内存,正如您可以在tutorialspoint的下一个示例中看到的那样:
https://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm
#include <string.h>
#include <stdio.h>
int main () {
char str[80] = "This is - www.tutorialspoint.com - website";
const char s[2] = "-";
char *token;
/* get the first token */
token = strtok(str, s);
/* walk through other tokens */
while( token != NULL ) {
printf( " %s\n", token );
token = strtok(NULL, s);
}
return(0);
}
考虑到这一点,如果您仍然希望以前只使用malloc将字符串复制到另一个字符串:
char *field;
// some code
field = malloc(strlen(token) + 1);
strcpy(field, token);
// do something
free(field)