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

int main()
{
    FILE *fp;
	char *fname ="test.txt";
	// 変数名にa,b,c,dとか意味のないものを使用しない。3日後にはワケワカメ。
	// 但し[c]は[char]のcなのでおｋ。
	// 型はintだけどfgetcで入力されるのは文字=characterなので一般的にはおｋ。
	// でも、ループカウンタはi,j,k辺りを使うのが慣例っぽい。
	// int c,a,b,d;
	int c;

	// doubleではなくint（charでもおｋだけど）。
	// double** matrix;
	int **matrix;
	int candidates_x, votes_y; /* size_x 行 size_y 列 */
	int i,j,count=0;

	printf("候補者数と投票者数を入力 >");
	scanf("%d%d", &candidates_x, &votes_y);
	fp = fopen( fname, "r" );
	if( fp == NULL ){
		printf( "%sファイルが開けません\n", fname );
		return -1;
	}
	// intに修正
	matrix = (int**)malloc(sizeof(int*)*candidates_x);
	if (matrix==NULL) exit(1);

	for (i=0 ; i < candidates_x ; i++) {
		// intに修正
		matrix[i] = (int*)malloc(sizeof(int)*votes_y);
		if (matrix[i]==NULL) exit(1);
	}
	i = j = 0;
	while( (c = fgetc( fp )) != EOF ){

		if('\n' == c){
			i = 0;
			j++;
			continue;
		}

		// ここもxとyが逆だった件に併せて修正
		// if(j >= votes_y){
		if(j >= candidates_x){
			break;
		}

		// ここもxとyが逆だった件に併せて修正
		// if(i < candidates_x){
		if(i < votes_y){
			// x"行"、y"列"だったのか…。
			// ファイル上でxが横方向、yが縦方向だと思ってたので間違い。格納場所を修正した。
			// ついでに、今回の場合だと、ファイルの数字（文字）を取得して、数値変換してから変数に格納した方が良い。
			// 「matrix[j][i]=c;」とするとmatrixには数値の1ではなく数字の'1'(=0x31)が格納されるので、
			// 後で比較するときに文字比較になって面倒。
			matrix[j][i] = c - '0';	// 必要なら数字以外が入力された場合の対応も書いてね^^;
		}
		i++;
	}
	// このループ内もxとyが逆だったので修正した。
	for (i=0 ; i < candidates_x ; i++) {
		for (j=0 ; j < votes_y ; j++) {
			// matrixをint型に修正したので(int)のキャストは不要になった。
			// ついでに数値変換して変数に格納しているので文字出力(%c)ではなく数値出力(%d)に変更
			printf("%d ",matrix[i][j]);
		}
		printf("\n");
	}
	// ループ終了時はj==votes_yになっているので、例えば3x3のときは[0][3]にアクセスしている。
	// 配列は0オリジンなのでインデックスは0～2、よって[1][0]へのアクセスと等価なので意図している処理とは違うはず。
	// ループを抜けた後の変数を使用するときは終了値に注意ね！
	// i=0;	a=matrix[i][j];

	// ループ内でループカウンタを使用して色々処理するときは、
	// ijkじゃなくて分かりやすい（意味のある）変数名にした方が良い。3日後には(ry
	{
		// 一時的に使用するだけのループカウンタなら、新たにブロックを作って宣言すればいい。
		// 後半でちょっとだけ使用するループカウンタをmainの先頭で宣言すると管理が大変。
		//（でもこういうソースをほとんど見たことがない。大規模なピュアCだと使ってるのかも？知らんけど^^;）
		int currentVote;			// 元a。投票数のチェック対象となる投票者番号。
		int candidateID;			// 元b。投票者番号を回すループカウンタ
		int candidateIndex;			// 元j。matrixの縦方向走査用カウンタ

		// IDは1～、indexは0～。
		for(candidateID = 1; candidateID <= candidates_x; candidateID++){
			for(candidateIndex = 0; candidateIndex < candidates_x; candidateIndex++){
				// とりあえずファイルの左端の列だけ（x=0固定）
				currentVote = matrix[candidateIndex][0];
				if(currentVote == candidateID){
					count++;
				}
			}
			printf("candidates%d=%d\n", candidateID, count);
			count=0;
		}
	}
	for (i=0 ; i < candidates_x ; i++) {
		free(matrix[i]);
	}
	free(matrix);
	fclose(fp);
	return 0;
}