C study

천동민·2023년 5월 7일
0

파일 입출력 공부하기

.txt .csv

기본적인 요소

outFile = fopen("", "");
fclose(outFile);

반드시 fclose를 통해 파일을 닫아줘야 한다

.csv 파일 : 텍스트를 ,로 구분
그렇기 때문에 csv파일을 통해 정보를 읽어 수행하려면
strtok의 함수를 사용하여 문자열을 잘라줘야 한다
ex

p = strtok(문자열 변수명, ",");
" "으로 공백을 기준으로 자르기도 가능하다.
  1. txt to csv


#include <stdio.h>
#include <string.h>

#define MAX 10

char *name[MAX + 1][20];
int num[MAX + 1];
char  *clear, *cl;
int kor[MAX + 1], eng[MAX + 1], math[MAX + 1], his[MAX + 1], mus[MAX + 1],avg[MAX + 1],rank[MAX + 1];
int sum[MAX+1] ;
char t1[10], t2[10], t3[10], t4[10], t5[10], t6[10], t7[10], t8[10], t9[10];
char test[100];
char enter[100];
char *title[MAX+1];
int a;
int cnt;
int main()
{
	FILE* fp,*outFile;
	outFile = fopen("out.csv", "w");
	if ((fp = fopen("test.txt", "r+")) == NULL)
	{
		printf(" file open error");
	}
	if (fp != NULL)
	{
		fgets(enter, 100, fp);

		clear = strtok(enter, " ");
		title[0] = clear;
		clear = strtok(NULL, " ");
		title[1] = clear;
		clear = strtok(NULL, " ");
		title[2] = clear;
		clear = strtok(NULL, " ");
		title[3] = clear;
		clear = strtok(NULL, " ");
		title[4] = clear;
		clear = strtok(NULL, " ");
		title[5] = clear;
		clear = strtok(NULL, " ");
		title[6] = clear;
		clear = strtok(NULL, " ");
		title[7] = clear;
		clear = strtok(NULL, " ");
		title[8] = clear;
		clear = strtok(NULL, " ");
		title[9] = clear;


		while (!feof(fp))
		{
			fgets(test, 100, fp);
			if (a >= 1);
			{
				sum[a] = 0;
				cl = strtok(test, " ");
				num[a] = atoi(cl);
				cl = strtok(NULL, " ");
				sprintf(name[a], "%s", cl);
				cl = strtok(NULL, " ");
				kor[a] = atoi(cl);
				sum[a] += atoi(cl);
				cl = strtok(NULL, " ");
				sum[a] += atoi(cl);
				eng[a] = atoi(cl);
				cl = strtok(NULL, " ");
				sum[a] += atoi(cl);
				math[a] = atoi(cl);
				cl = strtok(NULL, " ");
				sum[a] += atoi(cl);
				his[a] = atoi(cl);
				cl = strtok(NULL, " ");
				sum[a] += atoi(cl);
				mus[a] = atoi(cl);
			}
			a++;
			if (a > MAX-1) break;

		}
		for (int k = 0; k <= MAX; k++)
		{
			for (int j = 0; j <= MAX; j++)
			{
				if (a != j)
				{
					if (sum[k] >= sum[j]){cnt++;}
				}
				else{continue;}
			}
			rank[k] = (MAX + 1) - cnt;
			cnt = 0;
		}
		fprintf(outFile,"%s, %s, %s, %s, %s, %s
        , %s, %s, %s, %s",title[0],title[1],title[2],title[3],title[4]
        ,title[5],title[6],title[7],title[8],title[9]);
	}
	
	for (int i = 0; i < MAX; i++)
	{

		itoa(i+1, t1, 10);		
		itoa(kor[i], t2, 10);
		itoa(eng[i], t3, 10);
		itoa(math[i], t4, 10);
		itoa(his[i], t5, 10);
		itoa(mus[i], t6, 10);
		itoa(sum[i], t7, 10);
		itoa(sum[i] / 5, t8, 10);
		itoa(rank[i], t9, 10);
		sprintf(test, "%s, %s, %s, %s, %s, %s, %s, %s, %s, %s,\n",
			t1, name[i], t2, t3, t4, t5, t6, t7, t8, t9);
		fputs(test, outFile);
	}
	fclose(fp);
	fclose(outFile);
	return 0;
}

txt 파일을 csv로 변환해서 처리하기 위하여
공백을 기준으로 문자열을 잘랐고, csv 파일에 입력을 할 때 "%s,"와 같이 뒤에 ,를 입력하여
csv파일 변환에 알맞게 처리해 주었다.

csv to csv와 txt to csv 과정의 차이점은
문자열을 자르는 기준이다

0개의 댓글