#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char* buffer;
int size;
FILE* rfp = fopen("words.txt", "w+");
fseek(rfp, 0, SEEK_END);
size = ftell(rfp);
buffer = malloc(size + 1);
memset(buffer, 0, size+1);
fread(buffer, 1, size + 1, rfp);
for (int i = 0; i < (size/sizeof(char)) / 2; i++)
{
buffer[i] = buffer[size - 1 - i];
}
for (int i = 0; i < size / sizeof(char); i++)
{
fwrite(&buffer[i], sizeof(char), 1, rfp);
}
free(buffer);
fclose(rfp);
return 0;
}
이렇게 코드를 짜보았는데 실행하면 메모장이 지워지고
다르게 짜보아도 프롬프트 창에는 원하는 문자열이 출력되지 않습니다.
그리고 자꾸 memset 함수부분에서 버퍼 오버런이 발생하였다고 경고가 뜹니다. 크기를 size로 해도 size+1으로 해도 똑같은 경고가 뜹니다
연습문제에 나와있는 그대로 쓴거같은데 왜 이런 문제가 발생하는지 궁금합니다 ㅠㅠ
UNIT 71.3을 보면
파일 포인터를 처음 가져왔을 때는 파일의 앞을 가리키지만, 크기를 얻기 위해 끝까지 이동한 경우엔 파일의 끝을 가리킵니다.
이미 파일의 끝이므로 여기서 추가로 읽으려고 하면 범위를 벗어난 접근이 되니까 오류가 됩니다.
따라서 파일 포인터가 가리키는 위치를 끝에서 처음으로 다시 옮겨서 읽기 작업을 시작해야 합니다.
UNIT 71.3을 복습하고, 위 예제를 분석해보세요.
코드를 처음부터 다시 짜봤습니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char* buffer; // Hello, world!
int size;
FILE* fp = fopen("words.txt", "r+");
fseek(fp, 0, SEEK_END);
size = ftell(fp);
buffer = malloc(size + 1);
memset(buffer, 0, size + 1);;
fseek(fp, 0, SEEK_SET);
fread(buffer, 1, size, fp);
for (int i = size - 1; i >= 0; i--)
{
fwrite(&buffer[i], sizeof(char), 1, stdout);
}
free(buffer);
fclose(fp);
return 0;
}
이렇게 짜서 디버그를 하면 메모장에 어떤 내용이든, 원하던 결과인 거꾸로 출력이 되는데 심사문제에 제출하면 틀렸다고 나옵니다. ㅜㅜㅠ 대체 왜그런건가요??