c - 如何让我的 C 代码读取和存储文件
问题描述
我已经坚持了一段时间。我不确定如何将文件中的所有行打印到 C 终端,然后将其保存到数据结构中。我的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include "structure.h"
int main()
{
printf("Hello world!\n");
int i = 43;// number of iteration to save data in an array
int x;
FILE *fptr;
struct values *valuesPtr, values[x];
valuesPtr = &values[x];
if((fptr = fopen("energy.txt", "r")) == NULL)
{
printf ("Error opening file ");
return 0;
}
while (fptr != NULL)
{
for(x = 0; x < i; x++ )
{
fscanf(fptr, "%s %s %d", &valuesPtr->start_vertex, &valuesPtr->destination_vertex, &valuesPtr->num);
printf("\nStart vertex: %s \nDestination vertex: %s \nWeight: %d\n\n", valuesPtr->start_vertex, valuesPtr->destination_vertex, valuesPtr->num);
}
}
fclose(fptr);
return 0;
}
我的 structure.h 文件具有以下结构:
struct values{
int num;
char start_vertex[250];
char destination_vertex[250];
};
它目前只显示我文件的第一行。我希望它从文件中读取所有行,然后将该数据保存在数据结构中。您能否告诉我,我可以使用哪种最佳数据结构将文件中的所有元素保存在内存中以供以后使用。
解决方案
您初始化的方式valuesPtr
并不准确。valuesPtr = &values[x];
失败,因为数组values
可以采用的最大索引是x-1
(from 0 to x-1
)。它是一个指针,所以分配它(不要忘记x
先初始化):
struct values *valuesPtr = malloc(sizeof(struct values) * x);
if (!valuesPtr)
return -1;
或使用一维数组:
/*init x here*/
struct values valuesPtr[x]
如果你想通过 using 获得价值fscanf
,不要使用&
forchar
数组。使用如下:
int num = fscanf(fptr, "%s %s %d", valuesPtr[i].start_vertex, valuesPtr[i].destination_vertex, &valuesPtr[i].num);
// verify the the number (num) of input items successfully matched and assigned if you want.
更新测试:
struct values{
int num;
char start_vertex[250];
char destination_vertex[250];
};
int main()
{
printf("Hello world!\n");
int x = 3; // The number of lines that you want to get from file.
FILE *fptr;
struct values *valuesPtr = malloc(sizeof(struct values) * x);
if (!valuesPtr)
return -1;
if((fptr = fopen("text.txt", "r")) == NULL)
{
printf ("Error opening file ");
return 0;
}
for(int i = 0; i < x; i++ )
{
fscanf(fptr, "%s %s %d", valuesPtr[i].start_vertex, valuesPtr[i].destination_vertex, &valuesPtr[i].num);
printf("\nStart vertex: %s \nDestination vertex: %s \nWeight: %d\n\n", valuesPtr[i].start_vertex, valuesPtr[i].destination_vertex, valuesPtr[i].num);
}
free(valuesPtr);
fclose(fptr);
return 0;
}
文本.txt
ab cd 9
ef gh 10
ii cc 11
输出:
Hello world!
Start vertex: ab
Destination vertex: cd
Weight: 9
Start vertex: ef
Destination vertex: gh
Weight: 10
Start vertex: ii
Destination vertex: cc
Weight: 11
推荐阅读
- reactjs - 状态未设置,当它不正确时
- javascript - 检查输入的值
- ruby-on-rails - 复制的 Rails 应用程序,但现在设计不再工作
- c++ - 图问题:查找两个节点是否在 O(1) 时间和每个节点 O(1) 存储中共享相同的分支
- docker - 从正在运行的 docker 容器中取回文件?
- qt - QTableWidget 滚动到上一个值
- sql - 在 PDO 中转换 $_GET 值
- c++ - 如何修改 Lambda 表达式以将输出放入文本文件?
- python - Prim 的 Python 中的 MST 算法
- excel - 如何使用单元格值在 Excel 中创建文件夹和子文件夹