[C언어 질문] fprintf 함수로 파일에 배열출력을하는데 Segmentation fault 가 뜹니다.

freebsd626의 이미지

레드헷 리눅스/64비트 환경/C 언어 프로그래밍/gcc 컴파일러

질문 1.

fprintf 함수로 파일에 배열출력하려는데 컴파일때 에러는 안뜨는데, 실행파일 실행시 Segmentation fault 가 뜹니다.

하려는것은 아래와 같은 입력파일을 (실수형 3271 x 4 형 데이터)

---a.txt----
12.34 11.56 56.25 89.00
1.09 2.23 3.12 4.11
1.00 45.00 68.00 89.00
.
.

-----------

한줄한줄 열마다 a[i][0] 와같은 배열에 저장하여서...

다시 이 배열의 숫자들을 fprintf 함수를 써서 o.txt 에 똑같은 모습으로 다시 저장하고합니다.

아래와같이 코드를 짜고, gcc 컴파일을 하면 아무런 메세지가 뜨지않고 완료되고

실행파일을 실행시키면 Segmentation fault 가 뜨고, 목표한 o.txt 출력파일을 열어보면

어떠한 데이터도 없습니다.

fprintf(o,"%f %f %f %f\n", b, c, d, e); 을 fprintf(o,"%f %f %f %f\n", b[i][0], c[i][0], d[i][0], e[i][0]);

로 바꾸어 컴파일을 해보아도 메세지없이 완료되고, 역시 실행하면 Segmentation fault 가 뜹니다.

뭐가 문제인가요?

질문 2.

입력 파일 a.txt 가 3271 x 4 규모의 행렬이였는데요...

행의 줄숫자가 3271개가 아니라 임의의 수일때 일일히 행갯수를 입력안하고, 자동으로 처리 하는 방법이 있나요?

이거 정말 궁금합니다.ㅠ

P.S 아래 코드에서 #include 라 썼는데....보기에서는 가 빠져보입니다. gcc 컴파일 할때 오류메세지없었습니다.
==============================================================
#include
int main()
{
FILE *a=fopen("a.txt","r");
FILE *o=fopen("o.txt","w+");

int i;
float b[3720][0], c[3720][0], d[3720][0], e[3720][0];

for(i=0; i<3; i++)
{
fscanf(a,"%f %f %f %f\n", b[i][0], c[i][0], d[i][0], e[i][0]);
fprintf(o,"%f %f %f %f\n", b, c, d, e);
printf("%f %f %f %f\n", b[i][0], c[i][0], d[i][0], e[i][0]);

}

fclose(a);
fclose(o);

return 0;
}

익명 사용자의 이미지

float b[3720][0] => 3720행 0열 배열

선언시에는 float b[3721][1] => 3721행 1열 배열이고, 인덱스는 0부터 시작합니다.

fprintf(o,"%f %f %f %f\n", b, c, d, e);
b, c, d, e는 각각의 배열의 시작 주소 (= &b[0][0])를 나타내는 것으로 알고 있습니다.

값의 출력은
fprintf(o,"%f %f %f %f\n", b[i][0], c[i][0], d[i][0], e[i][0]);
이 맞습니다.

익명 사용자의 이미지

숙제처럼 보이네요.
처음부터 코드가 다 엉망이라 5줄짜리 지적글을 적다가 지웁니다.
공부하다가 질문하는 거면 이런 코드를 작성할리가 없다는 생각이 들어서
그냥 처음부터 공부 열심히 하시라고만 할께요.

freebsd626의 이미지

그냥 개초보인데 입문중입니다.

우선 #include 뒷 부분 <스탠다드인풋아웃풋.h> 은 원래 잘 썼는데...게시판에 쓰면 이상하게표시가 안됩니다...빈칸으로 나옵니다 왜그런지 저도모르겠습니다.

그리고, 첫번째 댓글님 조언대로 해보았습니다만(선언은 행열갯수그대로, 인덱스는 0부터) 그대로 Segmentation fault 뜹니다.

int main()
..

return 0;

이부분 그냥 main() { } 로 해도 마찮가지 오류 납니다...

고수분들께서는 왜 이것도 모르나 하시겠지만, 초보입장에서는 생소해서 무척어렵습니다. 양해바랍니다.

익명 사용자의 이미지

숙제가 아니라고 하시니...
위에서 알려줘도 모르실 수준이니,
무엇이 잘못되었는지는 문법책을 보면서 찬찬히 코드와 비교해보세요.

#include <stdio.h>
 
int main()
{
    FILE *a=fopen("a.txt","r");
    FILE *o=fopen("o.txt","w+");
 
    int i;
    float b[3720][1], c[3720][1], d[3720][1], e[3720][1];
 
    for(i=0; i<3; i++)
    {
        fscanf(a,"%f %f %f %f\n", &b[i][0], &c[i][0], &d[i][0], &e[i][0]);
        fprintf(o,"%f %f %f %f\n", b[i][0], c[i][0], d[i][0], e[i][0]);
        printf("%f %f %f %f\n", b[i][0], c[i][0], d[i][0], e[i][0]);
 
    }
 
    fclose(a);
    fclose(o);
 
    return 0;
}
freebsd626의 이미지

fscanf 함수에서는 변수주소를 지시하고, printf/fprintf 는 그냥 변수를 그대로 지시한다는거 알았는데..

그냥 변수에서는 그렇게했었거든요..

배열이라 헷갈렸습니다 -_-;; 등호(=) 사용할때 배열과의 관계에는 &를 안붙인다는 거랑 혼자 착각하고 멋대로 표기했었던거같습니다.

되네요...초보라 실수도 많고 착각도 잘합니다...널리 이해바랍니다....공부안한건 아닙니다 -_-;;;

감사합니다...

qiiiiiiiip의 이미지


총체적 난국이라 어디 하나를 지적할수가 없네요.

복잡한(?) 코드 올리고 하나씩하나씩 게시판에 물어보면서 공부하지 마시고,
입문이면 입문답게 책보고 기초부터 차근차근 공부하세요.

slow and steady wins the race라고 했습니다.

--

일단 배열의 사이즈가 0인것. scanf에 주소를 써줘야하는 것이 보이네요.
파일오픈후에 NULL체크도 해야하고요

freebsd626의 이미지

지금 책보고 천천히 하는겁니다 -_-;;;; 스스로 착각에 빠지면, 계속 못알아채더군요...이해바랍니다.....fscanf 에 주소쓰는거 알았는데..착각했습니다....
배열 인덱스 0 인것도 책에서 읽었는데...실수했네요 ㅠ

qiiiiiiiip의 이미지

총체적 난국이라는 표현은 죄송.. ^^

scanf나 배열 크기가 0인것 (인덱스가 아니라) 등은
그냥 단편적인 실수이고, 고치면 되는데,

그것보다는 배열의 use case나 변수 naming 등
프로그래밍 전반적인 이해가 부족해보여서요..

차근차근 열심히 하시길~~

세벌의 이미지

동문서답 한마디. freebsd 쓰시나봐요. 아이디를 보니...

freebsd626의 이미지

레드헷씁니다.....여기 가입할때 그거만 쓸수있었던적이있어서 ㅋㅋ 아 근데...이거 질문올리기가 무서워지네요...gcc 컴파일은 세그멘테이션 폴트로만나오고...아무 표시도 없으니...실수해도 어리버리하게 파악못하고 시간만 죽때리네요..-_-; 아님 딴 컴파일로 해도 그렇게뜨는건가요? ㅋㅋ

HDNua의 이미지

1. 입문서로는 윤성우 씨의 열혈 C 프로그래밍 입문서로 가장 좋지 않나 싶어요.

2. 프로그래밍 커뮤니티는 컴퓨터, 프로그래밍에 익숙한 사람과 그렇지 않은 사람이 이용하는 곳이 다른 것 같습니다.
KLDP의 경우는 보다 더 익숙한 분들의 모임이라, 아무래도 특이한 문법이 아닌 기초 문법에 대한 이해가 낮은 분께는
적합하지 않다고 생각하고 있어요.
(제가 잘 한다는 말은 아닙니다. 여기서 놀면서 제가 프로그래밍 좀 하는 사람과 논다는 근거 없는 자신감은 생기는데요. ㅎㅎ)
네이버 지식in이나 각종 프로그래밍 카페에 가보시면, 프로그래밍에 입문하는 분들에게도 친절한 분들도 많아서
걱정 없이 여쭤볼 수 있을 거라고 생각합니다.

3. 지금 댓글들을 보니 왠지 모르게 살짝 공격적인 느낌을 받았는데,
아마 최근에 활동하시는 어떤 분 덕분에 모두 민감해져서 그럴 거라고 생각해봅니다.

저는 이렇게 생각했습니다.

qiiiiiiiip의 이미지

> 기초 문법에 대한 이해가 낮은 분께는 적합하지 않다고 생각하고 있어요.

꼭 그렇지는 않은 것 같습니다.
기초적인 것 중에서 하나 포인트를 잡아서 질문을 하면 답변이 편한데,
그냥 무작정 소스 올리고 해결해주세요. 라고 하면
그건 숙제 대신해달라는 거죠. ( 학교 숙제든 회사 숙제든, 개인 숙제든 )

물론 초보가 그 포인트를 잡기 힘들다는 것은 이해합니다만..

HDNua의 이미지

다시 생각해보니 공부하자는 건데 누구에게 적합하고 말고는 없을 것 같기도 하네요.

저는 이렇게 생각했습니다.

mirheekl의 이미지

보통 독학으로 공부를 하게 되면 서적 등을 보고 처음부터 차근차근 하게 되는데, 이 경우에는 한꺼번에 여러 가지 문제가 발생하는 일이 별로 없습니다. 한 번에 한 스텝씩만 앞으로 가기 때문에.. 이런 경우에는 혼자 해결할 수 없는 문제를 만나서 질문을 올리더라도 영역이 한정되며 따라서 글을 보시는 분들이 문제를 이해하고 답변을 달기에도 상대적으로 수월합니다. 반면 이런 형태의 질문이 아닐 경우에는 중간에 뭔가 건너뛰었다는 얘기가 되므로 숙제를 올렸다고 생각하게 되거나, 차근차근 절차를 밟지 않고 성급하게 진도를 나갔다는 생각을 하게 되는 것입니다.

--

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.