镇楼图

Pixiv:唄

csv文件又叫做逗号分隔值文件。每一列用逗号,隔开,每一行用换行符\n隔开,这样的文件格式固定也容易处理,可以通过EXCEL获取。据我所知有很多游戏设计者会将构思的方案或者平衡好的数据放在excel里,然后需要程序员便对此进行处理来获取数据。

注:本篇blog需要你会C语言风格的IO

博主写的关于C语言IO的随笔

点我

==================

要处理的数据文件data.csv

黑魔术师,2500,2100
盖亚,2300,2100
猛犸的墓地,1200,1000
银牙狼,1200,800
友谊天使,1200,800
巴比伦,800,600

一开始我尝试使用结构体,发现太复杂了,而且无法用一个变量索引到结构体的成员变量,不具有通用性还有bug

于是我改成三维数组了(因为太菜只能一个个getc)

#include<stdio.h> 
#include<stdlib.h>
#define f(n) (n)

void csvdata(FILE*,int);

int main(void){
	FILE* fp;
	char n; 
	printf("请输入要截取的数据数:\n",&n);
	scanf("%d",&n);
	csvdata(fp,n);
}

void csvdata(FILE* fp,int n){
	fp = fopen("data.csv","r");
	char s[5][3][20];
	for(int i = 0;i < 5;i++){
		for(int j = 0;j < 3;j++){
			int count = 0;
			for(int k = 0;;k++){
				s[i][j][k] = getc(fp);
				int ch = s[i][j][k];
				if(ch == '\n' || ch == ',')break;
				count++;
			}
			
			for(int k = 0;k <= count-1;k++){
				printf("%c",s[i][j][k]);
			}
			printf("\n");
		}
	}
	fclose(fp); 	
}

但在最后我学习到了一个很神奇的格式化

能让我学会如何去处理各种格式固定的数据文件。

#include<stdio.h>
#define f(n) (n)

void csvdata(FILE* , int);

int main(void){
	FILE*fp;
	char n;
	printf("请输入要截取的数据数:\n",&n);
	scanf("%d",&n);
	csvdata(fp,n);
}

void csvdata(FILE*fp , int n){
	fp = fopen("data.csv","r");
	char name[f(n)][20],atk[f(n)][20],def[f(n)][20];
	for(int i = 0;i < n;i++){
		fscanf(fp,"%[^,],%[^,],%[^\n]\n",name[i],atk[i],def[i]);
		//正是这个[]不仅让截取字符串变得简单
                //注:scanf(%s,%s,%s\n)有很诡异的效果
                //有兴趣的可以试试
	}
    for(int i = 0;i < n;i++){
        printf("%s,%s,%s\n",name[i],atk[i],def[i]);
    }
    //这里已经是处理数据部分了
    //你可以对数据做更多复杂的处理
    fclose(fp);
}

如果说输出中文出现了乱码

那么最有可能的原因是编码问题,这里我是用Notepad++转换编码

看右下角的编码是UTF-8,而我要做的是把UTF-8的编码改成GB2312

你可以清楚地看到,输出的正是GB2312编码的数据,而你存入这个字符的时候却是用UTF-8的编码,那也难怪会出错了。
这里只要在GB2312编码下输出中文即可

修正后的结果

注:我只能确保我这个平台输出中文是用GB2312编码,我无法确保其他平台是否使用这个编码,也有可能使用GB2312就会出现乱码。具体情况还得要看你所使用的平台

但出现乱码问题的原因就是数据源的编码和输出所使用的编码不一致

参考资料

https://zh.cppreference.com/w/cpp/io/c/fscanf

posted on 2021-04-16 22:19  摸鱼鱼的尛善  阅读(494)  评论(0编辑  收藏  举报