c - C:无法将文件中的行存储到数组中
问题描述
这是我用来读取文本文件中的行并将其存储到“表达式”数组中的一些代码:
//create array for going through the file
char lines[128];
//create array for storing expressions
char **expressions = malloc(128*sizeof(char*));
FILE *file = fopen(argv[1],"r");
int count = 0;
while (fgets(lines,128,file)){
expressions[count] = lines;
printf("expressions[%d] is %s\n",count,expressions[count]);
count++;
}
for (int i = 0; i<count; i++){
printf("%s",expressions[i]);
}
这是这段代码试图阅读的文本:
f = g + h - 42;
g = 12 + 23;
我的问题是,虽然它似乎正确地通过了文件(计数与行数匹配),但最终的打印循环将最后一行打印g = 12 + 23
两次,而不是两个不同的行。为什么会发生这种情况,我可以做些什么来解决这个问题?
解决方案
每次读取一行时,将其存储在lines
字符数组中,然后将该数组的地址保存在expressions
. 如果您查看存储在其中的值,expressions
您会发现它们都是相同的。
如果您想保留每行的副本,则必须有空间来存储每行的副本。如果您有要处理的最大行数,则可以在程序中分配该内存。否则你将不得不开始使用动态内存分配。
让我们最多处理 100 行,每行不超过 127 个字符(如上):
char expressions[100][128];
int count = 0;
while (fgets(lines,128,file)) {
strcpy(expressions[count], lines);
printf("expressions[%d] is %s\n",count,expressions[count]);
count++;
if (count == 100)
break;
}
推荐阅读
- r - R闪亮的布局技巧条件面板
- javascript - 带有双反斜杠的节点中看似奇怪的 JSON.parse 行为
- c# - 转换为 ASPNET Core 3.1 后 MVC 找不到视图
- sql-server - 返回接下来的 10 天,包括工作日名称
- java - SourceAFIS Java - 创建指纹模板太慢了
- javascript - 按钮>随机图像>如果新图像-特殊>删除段落2中的上一个并在p2中显示图像>否则-删除p1中的前一个图像在p1中显示新图像
- javascript - Firebase 调用不更新值
- java - 从 url 下载图像并使用 Picasso 将它们保存在磁盘上
- sql - 当某些条件不独占时,如何从 SQL 数据库中的多个表中获取值?
- reactjs - REACT 中的 Rest API 调用