c - 文本行字符在c中动态计数
问题描述
char *line = NULL;
int count=0;
line = (char*)malloc(sizeof(char));
while(fgets(line,sizeof(line),file)){
line = realloc(line,sizeof(char*)); // dynamically increase allocate memory
count++;
}
printf("count number :%d\n",count);
free(line);
我正在尝试计算每一行阅读文本中的字符,但现在只尝试一行。每次计数都是 4,即使我给出了更多的字符串。我很困惑 。请帮我 !!
解决方案
一些问题:
首先,你想要一条线:
line = (char*)malloc(sizeof(char));
这相当于分配一个字节 -sizeof(char)
并将其地址存储到line
. 也许您想获得更大的缓冲区来从文件中获取一些字符。一种方法是定义一个常量大小:
#define BUFFER_SIZE 256
line = (char *)malloc(sizeof(char) * BUFFER_SIZE);
之后,您同时运行计数器。
while(fgets(line,sizeof(line),file))
也是错误的,因为您最多想读取sizeof(line)
字节,这相当于sizeof(char *)
. 它是 32 位或 64 位,具体取决于您的系统架构。
您想读取尽可能多的缓冲区大小,这意味着您想读取最多BUFFER_SIZE
字符。所以最好这样做:
while(fgets(line,sizeof(char) * BUFFER_SIZE, file))
{
/* do stuff */
}
这是一个警告:使用fgets
是危险的。如果您想从文件中获取字节并计算它们,您可以使用fread
:
size_t tmp;
while(tmp = fread(line, sizeof(char), BUFFER_SIZE, file))
{
count += tmp;
/* do stuff on line */
}
但是,如果您只想获取文件的大小,请查看其他帖子。
推荐阅读
- javascript - 如何在下一列的单元格中设置值?
- jquery - HTML:JQuery 每个选定的图像都出现在同一个容器中
- jdbc - 使用 SymmetricDS 连接到 firebird 数据库
- python - .read() 不获取整个文件内容 python
- r - 如何使用 purrr 在 R 中深度嵌套的列表列中提取属性?
- r - 在 R data.table 中,如何使用训练集的均值和标准差来标准化测试集
- javascript - 循环遍历对象数组并将每个对象映射到单个模板对象
- c++ - 3x3 浮雕内核的 5x5 等效值是多少?
- python - 在 pandas 中清理 tweets.csv:“TypeError:预期的字符串或类似字节的对象”
- java - 如果是您的个人资料,则新闻源上的帖子会重复出现,其他用户的帖子只会出现一次