鱼C论坛

 找回密码
 立即注册
查看: 1521|回复: 2

[已解决]求问fscanf与二维数组的问题

[复制链接]
发表于 2019-12-15 20:55:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wuliaaa 于 2019-12-15 20:56 编辑

问题:现在有一个文本,里面有像表格一样的数据像这样
weer 1234awf 2331
wwqeq q3231 24e3f
213yf 214 wqf
213g wdeqyq 213e
要把这一些数据,按照char字符串读取并存入二维数组a[][], 例如a[0][0]=weer, a[0][1]=1234awf这样,这样的代码要怎么写啊?(不是要print是要为后面的数据处理做准备)
我自己写的代码好像一直读取不了,没办法写入二维数组,都是换行符

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define hang 10
  4. #define lie 6

  5. int main()
  6. {
  7.         int i, j;
  8.         FILE *fid;
  9.         char a[hang][lie] = { 0 };
  10.         char str[256], str2, str3;
  11.         fid = fopen("data.txt", "a+");
  12.         for (i = 0; i < hang; i++){
  13.                 fscanf(fid, "%256[^,]", &str);
  14.                 for (j = 0; j < lie; j++){
  15.                         fscanf(fid, "%s ", &a[i][j]);
  16.                 }
  17.         }
  18. }
复制代码


求问这样代码要怎么设计啊 或者我自己编写的错误代码要怎么修改才能达成这个目的呢?数据用txt或csv都可以,谢谢啦
最佳答案
2019-12-15 22:36:24
本帖最后由 superbe 于 2019-12-15 22:49 编辑

测试代码如下。在你的代码上做了修改,可以实现要求的功能。我是在上面示例的4行3列的txt文件上测试的。
假定文件开始没有特殊行(比如空行),根据实际文件内容修改吧。
  1. /* data.txt
  2. weer 1234awf 2331
  3. wwqeq q3231 24e3f
  4. 213yf 214 wqf
  5. 213g wdeqyq 213e
  6. */

  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <malloc.h>
  10. #include <string.h>

  11. #define hang 4  //4行
  12. #define lie 3   //3列

  13. int main()
  14. {
  15.     int i, j;
  16.     FILE *fid;
  17.     char *a[hang][lie] = { 0 };
  18.     char str[256];
  19.     fid = fopen("data.txt", "r");
  20.    
  21.     /* 读入到数组 */
  22.     for (i = 0; i < hang; i++) {
  23.         for (j = 0; j < lie; j++) {
  24.             fscanf(fid, "%s", str);
  25.             a[i][j] = (char *)malloc(strlen(str)+1);
  26.             strcpy(a[i][j], str);
  27.         }
  28.         fscanf(fid, "%256[^\n]", str);
  29.     }

  30.     /* 显示数组内容(验证) */
  31.     for (i = 0; i < hang; i++){
  32.         for (j = 0; j < lie; j++) {
  33.             printf("%s ", a[i][j]);
  34.         }
  35.         printf("\n");
  36.     }

  37.     /* 释放内存 */
  38.     for (i = 0; i < hang; i++) {
  39.         for (j = 0; j < lie; j++) {
  40.             free(a[i][j]);
  41.         }
  42.     }

  43.     return 0;
  44. }
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-15 22:36:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 superbe 于 2019-12-15 22:49 编辑

测试代码如下。在你的代码上做了修改,可以实现要求的功能。我是在上面示例的4行3列的txt文件上测试的。
假定文件开始没有特殊行(比如空行),根据实际文件内容修改吧。
  1. /* data.txt
  2. weer 1234awf 2331
  3. wwqeq q3231 24e3f
  4. 213yf 214 wqf
  5. 213g wdeqyq 213e
  6. */

  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <malloc.h>
  10. #include <string.h>

  11. #define hang 4  //4行
  12. #define lie 3   //3列

  13. int main()
  14. {
  15.     int i, j;
  16.     FILE *fid;
  17.     char *a[hang][lie] = { 0 };
  18.     char str[256];
  19.     fid = fopen("data.txt", "r");
  20.    
  21.     /* 读入到数组 */
  22.     for (i = 0; i < hang; i++) {
  23.         for (j = 0; j < lie; j++) {
  24.             fscanf(fid, "%s", str);
  25.             a[i][j] = (char *)malloc(strlen(str)+1);
  26.             strcpy(a[i][j], str);
  27.         }
  28.         fscanf(fid, "%256[^\n]", str);
  29.     }

  30.     /* 显示数组内容(验证) */
  31.     for (i = 0; i < hang; i++){
  32.         for (j = 0; j < lie; j++) {
  33.             printf("%s ", a[i][j]);
  34.         }
  35.         printf("\n");
  36.     }

  37.     /* 释放内存 */
  38.     for (i = 0; i < hang; i++) {
  39.         for (j = 0; j < lie; j++) {
  40.             free(a[i][j]);
  41.         }
  42.     }

  43.     return 0;
  44. }
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-15 22:53:24 | 显示全部楼层
再仔细想一想,其实你要的是个三维数组而不是二维数组。

给个参考把
  1. #include <stdio.h>
  2. #include <string.h>

  3. #define N 100
  4. #define CX 6

  5. #define _Out_

  6. typedef char line[CX][N];
  7. void Read(const char* path,line* _Out_ ret){
  8.         FILE* fp=fopen(path,"r");
  9.         int y=0,x=0;
  10.         while (fscanf(fp,"%s",ret[y][x++])!=EOF){
  11.                 if (getc(fp)=='\n'){
  12.                         y++;
  13.                         x=0;
  14.                 }
  15.         }
  16.         fclose(fp);
  17. }

  18. int main(){
  19.         line a[100];
  20.         memset(a,0,sizeof(a));
  21.         Read("D:\\1.txt",a);
  22.         for (int y=0;a[y][0][0]!='\0';++y){
  23.                 for (int x=0;a[y][x][0]!='\0';++x){
  24.                         printf("%s ",a[y][x]);
  25.                 }
  26.                 printf("\n");
  27.         }
  28. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 18:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表