c 프로그래밍 파일 읽고 배열 질문있습니다.

익명 사용자의 이미지

안녕하세요. 요즘 c언어로 프로그래밍을 배우는 학생입니다.
해야되는것중에 하나가 data.txt파일을 열어서 그거를 배열로 저장해서 그 배열들을 이용해서 문제를 푸는 것인데 파일을 열어서 배열로 저장하는 방법을 잘 모르겠네요.
지금 data.txt파일이
-2, 3, 4
1, -3, -4
이런식으로 저장이 되어있습니다.
그걸 열기위해
FILE *fp;
fp=fopen("data.txt", "r");
for (ch = getc(fp); ch != EOF; ch = getc(fp))
if (ch == '\n')
r = r + 1;
c = r + 1;

이렇게 파일을 열고 그 뒤에 총 몇열인지와 몇행인지를 얻은것 같은데 이게 맞는것인지 모르겠네요.
그 뒤에 이제 배열에 저장하려고 하는데 malloc을 쓰면 좋다고 하는거 같아서 한번 써보려고 하는데 어떻게 하는건가요?

int **arr = (int **)malloc(r * sizeof(int *));
for (i = 0; i < r; i++) {
arr[i] = (int *)malloc(c * sizeof(int));
}
for(i = 0; i < r; i++) {
for(j = 0; j < c; j++) {
fscanf(fp, "%d", &mat[i][j]);
printf("%d\n",mat[i][j]);
}
}
을 하면 저장이 될줄 알았는데 안되네요... 도와주세요 ㅠㅠ
최종적인 목표로는
printf("%d", mat[0][0])
를 했을때 -2 라는 값이 나왔으면 좋겠습니다 ㅠㅠ

세벌의 이미지

초보자 같은데 우선은 그냥 배열 쓰시고, malloc 쓰는 건 좀 더 공부한 후 해보시는 게 좋겠습니다.

kldp에서는 소스코드 입력할 때
https://kldp.org/node/158191
참고하셔요.

raymundo의 이미지

제가 봐도 일단은 커다란 배열을 미리 선언한 다음에 그 중 일부만 쓰시는 게 나아보이고요.
(몇 행인지 알려면 일단 다 읽어봐야 하고 다시 데이터를 처음부터 읽느라 두 번 읽어야 하니까)

1)

fgets 로 한 줄을 통채로 읽고, strtok 으로 쉼표를 구분자로 해서 토큰을 뽑아낼 수 있습니다.
https://dojang.io/mod/page/view.php?id=376

뽑아낸 문자열을 atoi 로 정수값으로 변환할 수 있고요.

2)
아니면 fscanf로는...

#include<stdio.h>
 
int main()
{
    FILE *fp;
    int num;
    char temp[3];
 
    fp = fopen("data.txt", "rt");
 
    while ( fscanf(fp, "%d", &num) != EOF ) {   // 숫자를 읽고
        printf("[%d] ", num);
        fscanf(fp, "%*[ ,]");                   // 그 뒤에 스페이스와 컴마로 이뤄진 문자열을 읽고
        if (fscanf(fp, "%[\n]", temp)) {        // 다시 개행문자를 읽는 데 성공하면 한 줄 다 읽었다는 뜻
            printf("\n");
        }
    }
 
    fclose(fp);
}

여기에서 행과 열을 세고 배열에 값을 넣는 걸 추가하시면 되겠죠.

좋은 하루 되세요!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.