如何用fscanf_s调取txt中二维数组

qq_36510645 2017-10-18 10:54:50
我想用fscanf_s函数,调用txt里面的二维数组,但是不知道怎么用,求教
//读权矩阵
int** readWeight(int &n,char* filename)
{
FILE *fp;
fp = fopen(filename,"r");
if(fp == NULL)
{
printf("文件%s打开时出错\n",filename);
exit(1);
}

int i,j,**w;
fscanf(fp,"%d",&n);
w = (int**)calloc(n,sizeof(int*));
for(i = 0;i < n;i++)
{
w[i] = (int*)calloc(n,sizeof(int));
}

for(i = 0;i < n;i++)
{
for(j = 0;j < n;j++)
{
fscanf(fp,"%d",&w[i][j]);
}
}
fclose(fp);
return w;
}
不知道怎么改,可能是因为我的权重文件写的不对,权重信息如下
0,2,7,2,5
2,0,3,5,1
7,3,0,4,6
2,5,4,0,3
5,1,6,3,0
...全文
1103 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36510645 2017-10-18
  • 打赏
  • 举报
回复
试了一下,是没问题的,但是还是报错,不知道您了不了解tsp问题,我把代码附上,结果就是跑不出来,距离矩阵本来是 0 2 7 2 5 2 0 3 5 1 7 3 0 4 6 2 5 4 0 3 5 1 6 3 0 但是出现了中断,所以就把它改为 65535 2 7 2 5 2 65535 3 5 1 7 3 65535 4 6 2 5 4 65535 3 5 1 6 3 65535 改成这个的目的是为了让每个城市不经过自身 源代码附上,望大神指点: #include"stdafx.h" #include<stdio.h> #include<stdlib.h> #include<math.h> #include<windows.h> typedef struct tf* cnode; struct tf { int currentNode;//当前的节点 int set; //当前的状态集合,用二进制表示 int pathLength;//当前的路径值 cnode last;//记录上一个节点,以保存上一个的信息 cnode next;//记录下一个节点 }; struct tsp { int count;//当前的城市的个数 cnode* ltf;//记录struct tf数组 }; void output1(int *a, int n) { int i; for (i = 0; i < n; i++) printf("%d ", a[i]); printf("\n"); } void output2(int **a, int n) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("%d ", a[i][j]); } printf("\n"); } } //自定义的幂函数<用于之后的集合的表示> int mypow(int x, int y) { return (int)pow((double)x, (double)y); } //判断元素i是否在set集合中 int inSet(int set, int i) { if ((set&mypow(2, i - 1)) > 0) return 1; else return 0; } //将元素i插入集合set中 void insertSet(int &set, int i) { int p = mypow(2, i - 1); set = set | p; } //删除set中的i void deleteSet(int &set, int i) { set = ~(mypow(2, i - 1))&set; } //读权矩阵 int** readWeight(int &n, char* filename) { FILE *fp; errno_t err; if ((err = fopen_s(&fp, filename, "r")) != 0) { printf("文件%s打开时出错\n", filename); exit(1); } int i, j, **w; fscanf_s(fp, "%d", &n); w = (int**)calloc(n, sizeof(int*)); for (i = 0; i < n; i++) { w[i] = (int*)calloc(n, sizeof(int)); } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { fscanf_s(fp, "%d", &w[i][j]); } } fclose(fp); return w; } //返回组合数C(n,r)值 int ZuHeShu(int n, int r) { int i, c, k, *a; a = (int*)calloc(n, sizeof(int)); for (i = 0; i < n; i++) { a[i] = i + 1; } c = 0; do { i = -1; for (k = 0; k < r; k++) if (a[k] < n - r + k + 1) i = k; if (i != -1) { a[i]++; for (k = i + 1; k < r; k++) a[k] = a[k - 1] + 1; c++; } } while (i != -1); free(a); return c + 1; } //指定组合c(n,r)中所有可能组合,返回其转化后的01格式的int数组 int* ZuHeArray(int *a0, int n, int r, int sn) { int i, c, k, *set, *a; c = 0; set = (int*)calloc(sn, sizeof(int)); for (i = 0; i < sn; i++) { set[i] = 0; } a = (int*)calloc(n, sizeof(int)); for (i = 0; i < n; i++) { a[i] = i + 1; } int t; for (i = 0; i < r; i++) { t = a[i] - 1; insertSet(set[c], a0[t]); } do { i = -1; for (k = 0; k < r; k++) if (a[k] < n - r + k + 1) i = k; if (i != -1) { a[i]++; for (k = i + 1; k < r; k++) a[k] = a[k - 1] + 1; c++; for (k = 0; k < r; k++) { t = a[k] - 1; insertSet(set[c], a0[t]); } } } while (i != -1); free(a); return set; } //设置最后一个集合 int setLastSet(int n) { int i, set; set = 0; for (i = 0; i < n; i++) { set = set | mypow(2, i); } return set; } //获得第row行的set中所有元素集合 ,总元素的个数为n<非set集合中的元素个数> int* getSetNum(int set, int row, int n) { int i, j, *a; a = (int*)calloc(row, sizeof(int)); j = 0; for (i = 1; i < n; i++) { if (inSet(set, i) == 1) { a[j] = i; j++; } if (j == row) { break; } } return a; } //将集合a转为二进制的数 int setNumSet(int *a, int n) { int set, i, t; set = 0; for (i = 0; i < n; i++) { t = a[i] - 1; set = set | mypow(2, t); } return set; } //将set[n]中的第i个点删除 int* dropOneNode(int*set, int i, int n) { int * s, j, k; s = (int*)calloc(n - 1, sizeof(int)); k = 0; for (j = 0; j < n; j++) { if (j != i) { s[k] = set[j]; k++; } } return s; } //查找上一节点 cnode findNode(int row, cnode p, struct tsp circle) { cnode phead; phead = (cnode)malloc(sizeof(*phead));//必须分配空间 phead = circle.ltf[row]; cnode q; q = (cnode)malloc(sizeof(*q)); q = phead; while (phead != NULL) { q = phead; if ((q->currentNode == p->currentNode) && (p->set == q->set)) { break; } phead = phead->next; } return q; } //设置上一节点 void setLastNode(cnode p, int row, struct tsp circle, int **w) { int start = p->currentNode; cnode* clast; int i, n; n = circle.count; int *setNum; //将节点p中的set转为相应的int型数组 setNum = getSetNum(p->set, row, n); clast = (cnode*)calloc(row, sizeof(cnode)); //设置所有关联的上一级的接点 for (i = 0; i < row; i++) { int *dSet = dropOneNode(setNum, i, row); int sDNum; if (row == 1) { sDNum = 0; } else { sDNum = setNumSet(dSet, row - 1); } clast[i] = (cnode)malloc(sizeof(*clast[i]));//必须有的语句 clast[i]->currentNode = setNum[i]; clast[i]->last = NULL; clast[i]->next = NULL; clast[i]->set = sDNum; clast[i] = findNode(row - 1, clast[i], circle);//之后测试这个函数 } int minlength, minlabel; cnode q; q = clast[0]; minlength = w[start][q->currentNode] + q->pathLength; minlabel = 0; for (i = 1; i < row; i++) { q = clast[i]; int len = w[start][q->currentNode] + q->pathLength; if (minlength > len) { minlength = len; minlabel = i; } } p->last = clast[minlabel]; p->pathLength = minlength; } //设置集合,即已知起点,列举所有可能状态集合 int* setSet(int row, int start, int n, int &sn) { int *set, i, j, *a; sn = ZuHeShu(n - 2, row); //集合a中存放V中所用可能取得的点的下标 a = (int*)calloc(n - 2, sizeof(int)); i = 0; for (j = 1; j < n; j++) { if (j != start) { a[i] = j; i++; } } set = ZuHeArray(a, n - 2, row, sn); free(a); return set; } void tsp(char *filename) { int **w, n; //从文件中读取路径权值矩阵信息 w = readWeight(n, filename); //数据结构:使用的是链接结构 //每一层对应一行,每一层中所有的节点依次排列 struct tsp circle; circle.count = n; circle.ltf = (cnode*)calloc(n - 1, sizeof(cnode)); int i, j; for (i = 0; i < n - 1; i++) { circle.ltf[i] = NULL; } cnode p, q; q = (cnode)malloc(sizeof(*q)); //添加第一行 for (i = 1; i < n; i++) { p = (cnode)malloc(sizeof(*p)); p->currentNode = i; p->last = NULL; p->next = NULL; p->pathLength = w[i][0]; p->set = 0; if (circle.ltf[0] == NULL) { circle.ltf[0] = p; } else { q->next = p; } q = p; } int *sSet, sn, ts; //添加其余几行 for (i = 1; i < n - 1; i++) { for (j = 1; j < n; j++) { sSet = setSet(i, j, n, sn); for (ts = 0; ts < sn; ts++) { p = (cnode)malloc(sizeof(*p)); p->currentNode = j; p->set = sSet[ts]; setLastNode(p, i, circle, w);//是i不是j if (circle.ltf[i] == NULL) { circle.ltf[i] = p; } else q->next = p; q = p; free(sSet); } } } //求解最后的f0(v0,{v1,v2,...vn-1}); cnode last; last = (cnode)malloc(sizeof(*last)); last->currentNode = 0; last->set = setLastSet(n - 1); setLastNode(last, n - 1, circle, w); int *path; path = (int*)calloc(n, sizeof(int)); i = 0; p = last; while (p != NULL) { cnode p1 = p; path[i] = p->currentNode + 1; i++; p = p->last; } printf("最短路的路径为: "); for (i = 0; i < n; i++) { printf("%d -> ", path[i]); } printf("%d \n", 1); printf("最短路径的长度为:%d\n", last->pathLength); } void main() { tsp("da.txt"); system("pause"); }
ooolinux 2017-10-18
  • 打赏
  • 举报
回复
权重文件中的,逗号全部替换成空格试试。
里面都是我新手时期学C的时候整理的一些TXT文档,因为分不够了,所以放上来赚点积分,都是很基础的东西,里面的代码都是经过我测试的,保证可用。 (1)输出Hello,world (2)标识符 (3)常量与变量 (4)整型数据 (5)实型数据 (6)复合赋值表达式 (7)自加自减运算符和逗号表达式 (8)顺序结构及数据输出 (9)数据输入 (10)作业练习一 (11)关系运算符和逻辑运算符 (12)选择结构及条件表达式 (13)循环结构,while语句 (14)循环结构,do while语句 (15)循环结构,for语句 (16)字符型数据 (17)字符型数据实例,作业练习二 (18)函数定义 (19)函数应用实例,作业练习三 (20)指针的定义 (21)函数之间地址值的传递 (22)函数返回地址值 (23)一维数组的定义 (24)一维数组应用实例 (25)一维数组应用实例(2) (26)一维数组应用实例(3) (27)二维数组的定义 (28)二维数组的初始化 (29)二维数组与指针 (30)二维数组应用实例 (31)二维数组应用实例(2) (32)用一维数组来存储字符串 (33)字符串的输入与输出 (34)字符串数组 (35)用于字符串处理的函数 (36)字符串应用实例 (37)传给Main函数的参数 (38)函数指针 (39)函数的递归调用 (40)变量作用域和存储类别 (41)编译预处理和不带参数的宏替换 (42)带参数的宏替换和文件包含 (43)动态存储分配 (44)结构体变量的定义与引用 (45)利用结构体变量构成静态链表 (46)利用结构体变量构成动态链表 (47)共用体的定义与应用 (48)位运算符 (49)File文件的数据输出操作 (50)File文件的数据输入操作 (51)判断文件结束函数 (52)fscanf和fprintf函数 (53)fgets和fputs函数 (54)fread和fwrite函数 (55)文件定位函数 c switch的用法 c 避免调试窗口闪退 c 弹出消息窗口 c 等待函数(sleep) c 定义类成员 c 动态分配内存法定义数组 c 返回二维数组 c 方向键键码 c 改变字体颜色 c 绘制图形 c 获得鼠标当前位置坐标 c 检测键盘按键 c 检测鼠标按下事件 c 将整数转换成二进制数并存放到数组 c 结构体问题 c 使用winsock实现server和client(通讯程序) c 随机数发生器 c 图形模式详解 c 网页爬虫 c 写图形界面 c 遗传算法实例 c 在图形界面输出文字 c# List的用法 VS2010如何解决每次编译都要重新生成
C语言教程 C语言概述 7 C语言的发展过程 7 当代最优秀的程序设计语言 7 C语言版本 7 C语言的特点 7 面向对象的程序设计语言 8 C和C++ 8 简单的C程序介绍 8 输入和输出函数 9 C源程序的结构特点 10 书写程序时应遵循的规则 10 C语言的字符集 11 C语言词汇 11 Turbo C 2.0集成开发环境的使用 12 Turbo C 2.0简介和启动 12 Turbo C 2.0集成开发环境 13 File菜单 13 Edit菜单 14 Run菜单 15  Compile菜单 16 Project菜单 18 Options菜单 19 Debug菜单 23 Break/watch菜单 24 Turbo C 2.0的配置文件 24 程序的灵魂—算法 26 算法的概念 26 简单算法举例 26 算法的特性 29 怎样表示一个算法 29 用自然语言表示算法 29 用流程图表示算法 29 三种基本结构和改进的流程图 33 用N-S流程图表示算法 34 用伪代码表示算法 35 用计算机语言表示算法 35 结构化程序设计方法 36 数据类型、运算符与表达式 37 C语言的数据类型 37 常量与变量 39 常量和符号常量 39 变量 40 整型数据 40 整型常量的表示方法 40 整型变量 41 实型数据 44 实型常量的表示方法 44 实型变量 45 实型常数的类型 46 字符型数据 46 字符常量 46 转义字符 46 字符变量 47 字符数据在内存的存储形式及使用方法 47 字符串常量 48 变量赋初值 48 各类数值型数据之间的混合运算 49 算术运算符和算术表达式 51 C运算符简介 51 算术运算符和算术表达式 51 赋值运算符和赋值表达式 53 逗号运算符和逗号表达式 55 小结 55 C的数据类型 55 基本类型的分类及特点 55 常量后缀 56 常量类型 56 数据类型转换 56 运算符优先级和结合性 56 表达式 56 最简单的C程序设计—顺序程序设计 57 C语句概述 57 赋值语句 58 数据输入输出的概念及在C语言的实现 59 字符数据的输入输出 60 putchar 函数(字符输出函数) 60 getchar函数(键盘输入函数) 60 格式输入与输出 61 printf函数(格式输出函数) 61 scanf函数(格式输入函数) 63 顺序结构程序设计举例 67 分支结构程序 69 关系运算符和表达式 69 关系运算符及其优先次序 69 关系表达式 69 逻辑运算符和表达式 70 逻辑运算符极其优先次序 70 逻辑运算的值 70 逻辑表达式 71 if语句 71 if语句的三种形式 71 if语句的嵌套 75 条件运算符和条件表达式 77 switch语句 77 程序举例 79 循环控制 81 概述 81 goto语句以及用goto语句构成循环 81 while语句 81 do-while语句 83 for语句 86 循环的嵌套 88 几种循环的比较 88 break和continue语句 88 break语句 88 continue 语句 89 程序举例 90 数组 94 一维数组的定义和引用 94 一维数组的定义方式 94 一维数组元素的引用 95 一维数组的初始化 96 一维数组程序举例 97 二维数组的定义和引用 98 二维数组的定义 98 二维数组元素的引用 98 二维数组的初始化 99 二维数组程序举例 101 字符数组 101 字符数组的定义 101 字符数组的初始化 101 字符数组的引用 101 字符串和字符串结束标志 102 字符数组的输入输出 102 字符串处理函数 104 程序举例 106 本章小结 109 函 数 109 概述 110 函数定义的一般形式 111 函数的参数和函数的值 112 形式参数和实际参数 113 函数的返回值 114 函数的调用 114 函数调用的一般形式 114 函数调用的方式 115 被调用函数的声明和函数原型 115 函数的嵌套调用 116 函数的递归调用 118 数组作为函数参数 121 局部变量和全局变量 125 局部变量 125 全局变量 127 变量的存储类别 128 动态存储方式与静态动态存储方式 128 auto变量 129 用static声明局部变量 129 register变量 130 用extern声明外部变量 131 预处理命令 131 概述 132 宏定义 132 无参宏定义 132 带参宏定义 135 文件包含 138 条件编译 139 本章小结 141 指针 141 地址指针的基本概念 142 变量的指针和指向变量的指针变量 142 定义一个指针变量 143 指针变量的引用 143 指针变量作为函数参数 147 指针变量几个问题的进一步说明 150 数组指针和指向数组的指针变量 153 指向数组元素的指针 153 通过指针引用数组元素 154 数组名作函数参数 156 指向多维数组的指针和指针变量 162 字符串的指针指向字符串的针指变量 165 字符串的表示形式 165 使用字符串指针变量与字符数组的区别 168 函数指针变量 169 指针型函数 170 指针数组和指向指针的指针 171 指针数组的概念 171 指向指针的指针 174 main函数的参数 176 有关指针的数据类型和指针运算的小结 177 有关指针的数据类型的小结 177 指针运算的小结 177 void指针类型 178 共用体 178 定义一个结构的一般形式 179 结构类型变量的说明 179 结构变量成员的表示方法 181 结构变量的赋值 181 结构变量的初始化 182 结构数组的定义 182 结构指针变量的说明和使用 185 指向结构变量的指针 185 指向结构数组的指针 186 结构指针变量作函数参数 187 动态存储分配 188 链表的概念 189 枚举类型 191 枚举类型的定义和枚举变量的说明 191 枚举类型变量的赋值和使用 192 类型定义符typedef 193 位运算 195 位运算符C语言提供了六种位运算符: 195 按位与运算 195 按位或运算 195 按位异或运算 196 求反运算 196 左移运算 196 右移运算 196 位域(位段) 197 本章小结 199 文件 199 C文件概述 200 文件指针 200 文件的打开与关闭 201 文件的打开(fopen函数) 201 文件关闭函数(fclose函数) 202 文件的读写 202 字符读写函数fgetc和fputc 202 字符串读写函数fgets和fputs 206 数据块读写函数fread和fwtrite 207 格式化读写函数fscanf和fprintf 209 文件的随机读写 210 文件定位 210 文件的随机读写 211 文件检测函数 211 文件结束检测函数feof函数 212 读写文件出错检测函数 212 文件出错标志和文件结束标志置0函数 212 C库文件 212 本章小结 213

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧