c언어 2차원배열에 파일입력받기질문
조회수 6090회
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define w 5
#define h 16
pt_buffer(char buffer[w][h])//배열출력함수
{
int i = 0;
while (buffer[i][0] != '\0')
{
printf("%s", buffer[i]);
i++;
}
}
int main()
{
FILE *fp = fopen("indata.txt", "w");
fputs("-----I-I------\n"
"----I---I-----\n"
"----I----IIII-\n"
"----I----IIII-\n",
fp);
// 파일에 문자열 저장
fclose(fp);
// 파일 포인터 닫기
char buffer[4][14];
// 파일을 읽을 때 사용할 임시 공간
int i = 0;
FILE *ff = fopen("indata.txt", "r");
// hello.txt 파일을 읽기 모드로 열기.
memset(buffer, NULL, 4 * 14);
// 파일 포인터를 반환
while (!feof(ff))
{
fgets(buffer[i], 14, ff);
i++;
};
// Hello, world!: 파일의 내용 출력
i = 0;
fclose(ff);
while (buffer[i][0] != NULL)
{
printf("%s", buffer[i]);
i++;
}
return 0;
}
이 코드가 실행은 되는데 왜 디버그가 뜨는지 모르겠어요...
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
1 답변
-
디버그
란 프로그램의 오류를 해결하기 위한 행위를 말하는 것이지, 프로그램 동작시 발생하는 문제를 지칭하지 않습니다.C언어에서 문자열이란 마지막에
\0
이 포함됩니다. 만약 14자의 문자를 갖는 문자열일 경우 배열으 크기는 15이어야 합니다.그리고
while (buffer[i][0] != NULL)
와 같은 방법식으로 배열의 끝을 판단하기 위해서는 배열이 실제 담고 있을 원소보다 하나더 커야합니다. 따라서char buffer[4][14];
가 아닌char buffer[5][15];
가 되어야 됩니다.하지만 여기서 한가지 문제가 있습니다.
fgets(buffer[i], 14, ff);
이렇게 호출한다면 최대 14자가 아닌 13자의 글자를 읽어 들입니다. 여기서 입력한 두번째 인자란 첫번째 인자의 크기를 의미합니다. 문자열이기 때문에 마지막 한 자리는\0
을 위해 사용됩니다. 그렇다고fgets(buffer[i], 15, ff);
로 바꾸면 14자를 읽어 들이겠지만 여기서도 문제가 발생합니다.파일에는 각 줄당
-----I-I------\n
와 같이 14자 + 1자가 저장되어 있습니다. 만약 아래와 같이 실행한다면fgets(buffer[0], 15, ff); fgets(buffer[1], 15, ff);
buffer[0]
은-----I-I------
이 되고buffer[1]
은\n----I---I----
이 될 것입니다. 그렇기에 15자를 읽도록 작성해야buffer[0]
는-----I-I------\n
,buffer[1]
은----I---I-----\n
이 될 것 입니다.위에서 언급한 내용을 반영하면 아래와 같습니다.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { FILE *fp = fopen("indata.txt", "w"); fputs("-----I-I------\n" "----I---I-----\n" "----I----IIII-\n" "----I----IIII-\n", fp); // 파일에 문자열 저장 fclose(fp); // 파일 포인터 닫기 char buffer[5][16]; // 파일을 읽을 때 사용할 임시 공간 int i = 0; FILE *ff = fopen("indata.txt", "r"); // hello.txt 파일을 읽기 모드로 열기. memset(buffer, 0, sizeof(buffer)); // 파일 포인터를 반환 while (!feof(ff)) { fgets(buffer[i], 16, ff); i++; }; // Hello, world!: 파일의 내용 출력 i = 0; fclose(ff); while (buffer[i][0] != '\0') { printf("%s", buffer[i]); i++; } return 0; }
- 하지만 파일을 행이 4열이고 열이 14인 배열에 입력받아져야해서 배열을 변경할수는 없어요.. 알 수 없는 사용자 2018.9.27 13:52
- 말씀하신대로 변경해봤는데 결과가 4줄 14열로 나와햐는데 결과가 다르게 나와요.. 알 수 없는 사용자 2018.9.27 14:10
- 디버그는 안뜨는데 원래 만드려던 결과인 프린트 f의 내용들이 뒤섞여서 나와요.. 알 수 없는 사용자 2018.9.27 14:18
- 제가 착각을 했네요. 다시 답변 달겠습니다. 유동욱 2018.9.27 14:41
- 감사합니다 2시간동안 이거 저거 바꾸어보고 인터넷 뒤져봐도 해결이 안되서요 ㅜㅠ 알 수 없는 사용자 2018.9.27 15:05
- 감사합니다 2시간동안 인터넷 뒤져보고 이거 저거 만져봐도 해결이 안되서요.. 알 수 없는 사용자 2018.9.27 15:06
- 하나 더 질문해도 될까요? 알 수 없는 사용자 2018.9.29 12:06
- 문자열 한개당 배열 인덱스 하나를 차지하도록 코딩하고 싶으면 어떻게 해야할까요?? 알 수 없는 사용자 2018.9.29 12:07
- 예를 들어 printf('%s',buffer[1][0]) 결과 값은 - 가 나오도록요 알 수 없는 사용자 2018.9.29 12:08
- 2차 배열이 아닌 1차 배열을 사용하고 싶으시단 말씀인가요? printf('%s',buffer[1][0]) 이것이 뭘 의미하는지 잘 모르겠습니다. 유동욱 2018.9.29 12:21
- 제가 미로찾기 게임을 만드는것인데 배열인덱스 한개당 벽아니면 길이 배열되도록 만들어야해요 '-'은 길이고 'I'는 벽인 셈입니다 알 수 없는 사용자 2018.9.29 12:25
- 올려주신 코드에는 배열buffer[0]에 한줄이 다들어간셈이잖아요? 제가 필요한 것은 buffer[0][0]에 문자열 하나 buffer[0][1]에 문자열 하나 이런식으로 문자열을 할당해야해요.. 알 수 없는 사용자 2018.9.29 12:26
- fread 함수로 만들어보려고했는데 잘안돼서요 알 수 없는 사용자 2018.9.29 12:27
- 문자열이란 문자의 나열입니다. 일종의 문자배열 이라고 생각하시면 됩니다. buffer[0][0]은 문자 하나입니다. 여기서 '-'인지 'I'를 비교하면 된답니다. 즉, 이미 원하시는 내용이 가능한 코드입니다. 유동욱 2018.9.29 12:30
- 감사합니다!! 알 수 없는 사용자 2018.9.29 12:39
- 하나 더 질문해도 될까요 선생님?? 알 수 없는 사용자 2018.9.30 13:12
- 배열을 출력하는 부분을 함수로 만들어서 편하게 쓰고 싶은데 자꾸 오류가 뜨네요.. 알 수 없는 사용자 2018.9.30 13:13
- #pt_buffer(char buffer[w][h])//배열출력함수 { int i = 0; while (buffer[i][0] != '\0') { printf("%s", buffer[i]); i++; } } 알 수 없는 사용자 2018.9.30 13:13
- #define w 5 #define h 16 pt_buffer(char buffer[w][h])//배열출력함수 { int i = 0; while (buffer[i][0] != '\0') { printf("%s", buffer[i]); i++; } } 알 수 없는 사용자 2018.9.30 13:14
- 이런식으로 만들고싶은데 오류가 나요 ㅠ 알 수 없는 사용자 2018.9.30 13:14
- 위에 질문수정하여 코드 올렸습니다 알 수 없는 사용자 2018.9.30 13:15
댓글 입력