C프로그래밍 질문드립니다

[code:1bbz5ksh]
#include <stdio.h>

int main(void)
{
int state;
char val[30];

int i=0;

/* File opening */
FILE* file = fopen(&quot;Test&#46;txt&quot; , &quot;rt&quot;);

if(file==NULL)
{
	printf(&quot;File opening Error&#46; \n&quot;);
	return 1;
}

/* input in val&#91;30&#93; */
fputs(&quot;Please input data&#58;&quot; , stdout);
fgets(val, sizeof(val), stdin);
puts(val);

/* Read the data in Test&#46;txt =&gt; Test&#46;txt에 있는 데이터를 val배열에 입력 시킨다&#46; */
fgets(val, sizeof(val), file); // val=30&#46;
puts(val); // 의문점

while(val&#91;i&#93; != '\0')
{
	i++;
}

printf(&quot;The size that saved in arrangement 'val' &#58;%d \n&quot; , i+1);

/* File closing */
state = fclose(file);

if(state!=0)
{
	printf(&quot;File closing Error&#46; \n&quot;);
	return 1;
}

return 0;

}
[/code:1bbz5ksh]

성공적으로 컴파일이 완료되었고 프로그래밍 또한 잘 작동합니다. 하지만 자세히 살펴보니 의문점이 하나 생기더군요, 바로 val[30] 배열에 관한 것 인대요.

<프로그램 순서도>

‘읽기전용’ 으로 Test.txt 라는 파일을 생성하고,

fgets함수를 이용해서 사용자로부터 데이터를 입력받고 val[30]에 저장후 val[30] 출력,
=> 입력받은 그대로 출력.

fgets함수를 이용해서 파일로부터 데이터를 입력받고 val[30]에 저장후 val[30] 출력, (Test.txt에는 "C-programing" 이라는 문자열이 저장되어 있습니다.)
=> 의문점 발생 지점, 입력받은 데이터는 출력시키지 않고 파일로 부터 입력받은 데이터만 출력 (C-programing)

while반복문을 이용해서 val[30] 에 저장된 데이터의 크기를 출력. => (13이 출력됨)
=> 사용자가 저장한 데이터는 어디로(?)

파일 종료후, 프로그램 종료.

<끝.>

val[30]에 분명 사용자로 부터 한번 입력받은 데이터를 저장했고, 또 Test.txt파일로 부터 읽어들인 데이터 또한 저장했는대 왜 [puts(val); // 의문점] 으로 출력 했을때는 파일로부터 입력 받은 데이터만 출력이 되는건가요?? while문을 통해서도 val[30] 에는 13개의 문자가 저장되어 있내요.

덮어쓰기라고 생각하시면 이해하기 쉬울 듯합니다.

[quote="ihavnoth":126zr65p]덮어쓰기라고 생각하시면 이해하기 쉬울 듯합니다.[/quote:126zr65p]

덮어쓰기요??.. 자동적으로 수행되는 작업인건가요??

사용자에게 입력받은 것과 파일에서 입력받은 것이 연이어 저장되도록 하고 싶으신 건가요?

지금 상황에선 앞 분이 말씀하셨듯이 덮어씌워집니다. 왜냐하면 fgets는 첫 번째 인수가 가리키는 지점부터 기존 데이터가 있든 없든 그대로 새 입력을 써넣기 때문입니다.
작성하신 코드를 보면, ​사용자에게서 입력받은 후라도 vals는 여전히 문자열을 저장하는 공간 맨 처음을 가리킵니다. 그래서 다음과 같은 상황이 발생합니다.

[code:8tl0m9kj]

  • 시작

±----------------
| | | | ...
±----------------
^
|
vals

  • 사용자로부터 30을 입력받은 후

±----------------
| 3 | 0 | \0 | ...
±----------------
^
|
vals

  • fgets(vals, ...)로 파일 내용을 입력받은 후

±----------------
| C | - | P | ...
±----------------
^
|
vals
[/code:8tl0m9kj]

이를 피하시려면 fgets 후에​ 문자열의 길이를 재어 기존 내용을 건너뛴 지점부터 fgets 하십시오.

[code:8tl0m9kj]
size_t n;

fgets(val, sizeof(val), stdin);
puts(val);

// 입력받은 길이 계산​
n = strlen(val);

// 이전에 입력받은 길이만큼 건너뛴 지점부터 입력받는다.
// ±----------------
// | 3 | 0 | \0 | ...
// ±----------------
// ^ ^
// | |
// vals vals + n
fgets(val + n, sizeof(val) - n, file);
puts(val);
[/code:8tl0m9kj]