ini 프로그램 (노지피티)

2025. 10. 28. 18:06·C#

PracINI.sln
0.00MB

[프로그램 개요]
- ini 파일을 읽고 수정할 수 있다.
1. 파일을 읽는다.
2. 파일을 조회한다.
3. 파일을 수정한다.
4. 파일을 저장한다.

# 피드백
1. 리스트 원리
2. 주석은 나를 위해 다는 것
3. 좀 더 개발속도 높이기 = 개인시간 할애하기(정공법)
4. 기능수행 검증하면서 하기
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; // 파일스트림
using System.Windows.Forms; // OpenFileDialog
using System.Runtime; // Trim

namespace IniProgram
{
    public partial class Test : Form
    {
        // < 변수 모음 >
        string filePath; // 파일경로 (다양한 함수에서 써야하니 전역으로 둔다)
        int lineCount; // 파일이 총 몇줄인지 카운트

        // 파싱한걸 담을 변수들
        string allFile;

        char section; // 섹션을 저장하는 변수
        char key; // 키를 저장하는 변수
        char value; // 값을 저장하는 변수

        List<char> sections; // char형 리스트 배열 (동적할당)
        List<char> keys;
        List<char> values;

        public Test()
        {
            InitializeComponent();
        }

        // 1. 파일열기 //////////////////////////////////////////////////////////////////////////
        private void btn_open_Click(object sender, EventArgs e)
        {
            // sender = 이벤트를 보내는 객체
            // e = 이벤트 핸들러가 사용하는 파라미터
            // 이벤트 핸들러를 추가하는 가장 간단한 방식 = 더블클릭

            OpenFileDialog ofd = new OpenFileDialog(); // 파일 대화상자 객체 생성

            if (ofd.ShowDialog() == DialogResult.OK) // ofd가 대화상자를 띄움
            {
                filePath = ofd.FileName; // 경로를 저장하는 변수에 파일명 저장
                //MessageBox.Show("선택한 파일: " + filePath);
            }

            // [파일읽기]
            allFile = File.ReadAllText(filePath); // 변수에 파일내용 다 넣기

            lineCount = File.ReadAllLines(filePath).Length; // 파일이 몇줄인지
            Console.WriteLine($"줄수:" + lineCount); // for문 돌릴 때 필요함

            tb_allFile.Text = allFile; // ui 표시
            pasingFile(filePath, allFile);// 파일 읽었으니까 이제 파싱

        }

        // 2. 파싱하기 //////////////////////////////////////////////////////////////////////////
        private void pasingFile(string filePath, string allFile)
        {
            Console.WriteLine($"(전)allFile=" + '\n'  + allFile); // 현재 담은 데이터 찍어보기 (뭐들어있나)

            // 인스턴스 생성 (메모리 할당)
            sections = new List<char>();
            keys = new List<char>(); 
            values = new List<char>();

            
            // 본격 파싱 조건문
            for (int i=0; i<lineCount; i++) // 줄수만큼 반복 (한줄한줄 읽기)
            {
                allFile.Replace("\n", ""); // 개행 제거
                allFile.Trim(); // 문자열 앞뒤 공백 제거
                allFile.Trim('\n'); // 개행 제거 
                //Console.WriteLine($"allFile 수정 후: " + allFile);

                string[] data = allFile.Split('\n'); //한줄씩 배열에 저장(인덱스로 꺼내쓰기)
                data[i].Trim(); // 한줄씩 앞뒤 공백 제거
                data[i].Replace(" ", " "); // 한줄씩 개행있으면 제거

                if (string.IsNullOrWhiteSpace(data[i])) // 빈줄 제거 시도
                {
                    continue;
                }

                // (1). 섹션 파싱
                if (data[i][0] == '[') // [ 로 시작하는 줄이면 섹션임
                {
                    section = data[i][1]; // 섹션의 경우 [0],[1],[2] 중 [1]만 추출
                    Console.WriteLine("추출한 섹션값: " + section);
                    sections.Add(section); // 섹션 리스트에 추가
                }

                else
                {
                    // (2). 키,값 파싱
                    //if (data[i][1] == '=' && data[i][0] != ' ') // 가운데에 = 이 있고, 첫번째가 공백이 아님
                    if (data[i][1] == '=') // 가운데에 = 이 있음
                    {
                        key = data[i][0]; // = 앞에가 키
                        keys.Add(key);

                        value = data[i][2]; // = 뒤에가 값
                        values.Add(value);

                        Console.WriteLine("추출한 키/값: " + key + '/' + value);

                    }
                }
            }

            foreach (char s in sections)
            {
                Console.WriteLine("sections: " + sections); // 파싱한 섹션값 출력하기
            }

            // [파싱값 ui에 띄우기]
            showData(sections, keys, values);
        }

        // 3. 데이터 띄우기 //////////////////////////////////////////////////////////////////////////
        private void showData(List<char> s, List<char> k, List<char> v)
        {
            string ss;
            s.ToString();


        }

        // 4. 저장하기 //////////////////////////////////////////////////////////////////////////
        private void saveFile(string filePath, string allFile)
        {
            // 특정 요소만 저장하면되니까 for문
            File.WriteAllText(filePath, allFile); // 지정 파일경로에 저장한 파일을 저장
        }
    }
}

'C#' 카테고리의 다른 글

break문 분석  (0) 2025.10.29
data 변수의 자료형을 list<string> 으로 바꾼 버전  (0) 2025.10.29
반복문 for VS for each 차이  (0) 2025.10.28
ini 프로그램 (gpt 사용)  (0) 2025.10.27
C# ini 파일 읽기  (0) 2025.10.27
'C#' 카테고리의 다른 글
  • break문 분석
  • data 변수의 자료형을 list<string> 으로 바꾼 버전
  • 반복문 for VS for each 차이
  • ini 프로그램 (gpt 사용)
joo_coding
joo_coding
2025.02.18~
  • joo_coding
    주코딩일지
    joo_coding
  • 전체
    오늘
    어제
    • 분류 전체보기 (219)
      • 일지 (19)
      • 계획표 (7)
      • 프로젝트 (6)
      • C언어 (35)
        • 연습장 (12)
      • C++ (3)
      • C# (34)
      • Python (28)
        • 연습장 (11)
      • TCP IP (4)
      • DB (2)
      • ubuntu (1)
      • Git (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    c언어 #vscode #gcc #윈도우 #c언어윈도우 #gcc윈도우 #vscode윈도우 #c #c++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
joo_coding
ini 프로그램 (노지피티)
상단으로

티스토리툴바