1번)
이렇게 하면 fruit[0] = "apple", ...... 이런식으로 순차적으로 만들어 지잖아여
2번
그런데 목록이 너무 길어서 , FILE로부터 fruit 에 입력하고 싶은데요
char **fruit;
FILE *fp=fopen("fruit.txt", "r");
while(fp!=EOF)
fscanf(fp, "%s", &fruit[i]);
이렇게 하면 되는거는 알겠는데.... 메모리의 공간의 효율성을 고려할때.
위 1번처럼 공간의 낭비없이 FILE 로 부터 입력 받는 방법이 있나요?
있으면 조언좀 해주세요
해당 댓글은 삭제되었습니다.
i++; 이거 생략한거예요,
i++는 애초에 들어갈 일이 없는데 왜 들어감
문자열 배열이니깐, fruit[0], fruit[1] 이렇게 되야하니깐 i++ 필요해요
아 그거 말하는거였냐
메모리 낭비 딱히 없는데 파일에서부터 입력을 받을라면 파일 오버헤드는 필히 발생하는거고 배열 낭비도 없음 근데 니 동적배열 공간 할당은 왜 안하냐
그러니깐 동적할당해서 하면 빈공간이 생기니깐, 내가 물어보는거예요..
동적 공간을 꼭 입력 받기 전에 할당할 필요 없지 파일 내용을 읽어올 때 마다 하나씩 공간을 할당해 안그러면 동적 배열이 무슨 의미가 있냐 고정배열 쓰지
아 그러면 temp 에다가 입력을 받고, 크기를 구해서 동정할당을 하고, 그것을 넣는 방식이군여?
아니 while 안에서 도는 코드는 일단 줄이 안끝났다는거잖아 그러면 while 안에서 동적배열을 하나씩 추가로 만들어주라니까
그런데 문제가 한 개가 있어요, while 문 안에 할당하는거 말고, while 문 밖에 fruit 2차배열의 크기를 지정해줘야하는데
파일의 크기가 커질 수 있기때문에 고정하기 싫은데 어떻게????
그럴거면 파일 첫줄에 미리 배열 공간을 적어주던가 해야지 아예 while 문 밖에서 파일에 들어있는 데이터가 얼마나 큰지 어떤 유형인지 프로그램이 어떻게 알고 딱맞게 할당을 하냐
그래서 여쭤 보는거예요, 파일에 100단어라면 동정할당으로 100개의 문자열 배열을 주고, 각 배열마다 while 안에서 그 크기를 동정할당 할 수 있지만, 그 파일에 100단어 이상 추가가 될 경우, 이 때 recalloc 하던지해서 100개 이상의 문자열 배열인지를 줘야하는데,
파일에 포함된 단어의 수가 100개인지 아니면 그 이상인지 파악을 하는 방법이 있어야 되는데, 무슨 방법이 있어야 되는데...모르겠어요
니가 하는 말은 난 시험문제 1번 정답 2번이라고 보지만 시험문제 1번의 문제는 모른다 하는거랑 마찬가지야 전혀 말도 안되는 소리지 문제도 모르는데 어떻게 답을 내냐? 내용을 알기 전인데 어떻게 배열 공간을 딱 맞게 하냐 이말이다
국어 공부부터 하고 와
방법이 전혀 없는거는 아닌데, 너무 복잡한 방법이라서 ... 전체를 읽어오고 나누는 방법이 있기는 한데요 strok() 같은것으로... 그런데 다른 방법이 있어야 될것만 같은데요...
strtok을 왜 써; 다른 방법도 많구만
그니까요 너무 귀찮은 방법이라서... 걍 rewind() 이용해서 두번 읽을까 고민중이네요
초딩코딩아 컴퓨터는 미래를 내다보는 타임머신이 아냐 적어도 예측은 할 수 있는 환경을 니가 만들어주거나 현재에 대응시켜줘야 한다 니 생각대로 그렇게 예지몽은 못꾼다
파일을 두 번 읽어오는 방법으로 예전에는 해결했었는데요, 가만히 생각해보니까요... 그 방법이 걍 젤 나은듯요
배열 크기 크게크게 잡고 팍!팍! 넣으십쇼!
그렇게 하면 메모리 사용에 낭비가 있어서 물어보는 거예요, 그리고 해결방법 아미 나왔습니다.
gcc면 %s 대신 %as 쓰면 gcc에서 알아서 동적할당 해줄걸
as 하면 동정할당도 해준다고요?
ㅇㅇ
그런데 문제는 문자열 배열은 사실 2차원배열인데요, 문제는 100개의 서로 다른 길이의 단어들을 저장하는거라서, as 가 되건 안되건 그게 문제가 아니고, 이 단어가 몇개인지? 입력받으면서 해결할 수 있는가? 없는가? 인데요
그러니까 너는 단어의 개수가 몇 개인지 미리 알아내서, 할당한 다음 입력을 받는 방법이 있는 걸 물어보는 거 맞음?
네 입력받으면서 간단하게 끝낼 수 있는 방법이요
물론 해제는 니가 알아서 해줘야됨
혹은 fruit의 항목의 최대 길이를 알고 있다면, 버퍼를 만들어서 우선 거기다가 쓴 다음, 길이를 구한 다음에 fruit 배열에 복사하는 방법도 있음
윗댓글대로 버퍼를 쓰는 방법이 있고 파일을 두번 읽는 방법도 있기는 있다 파일의 내용은 안읽고 row 수만 카운트 하고 배열을 할당하는 방법이 있다 근데 굳이 왜 이래야 하는지 이해를 못하겠네
첫번째는 아주 커다란 고정배열을 만들거나 realloc 쓰는 동적배열로 긁어오고 그걸 니가 실제로 쓸 배열에 복사하거나 처음에 파일 row를 읽고 row만큼의 메모리 크기로 동적 할당을 해서 다시 파일 while문 또 돌려서 데이터를 가져오는 방법이 있다 어느쪽이든 비효율적일 수 밖에 없다
아 두번, 예전에 그방법을 썼었네요 rewind() 해서... 그냥 그렇게 할까요 새로운방법이 있을거만 같아서요
제일 좋은 방법은 파일에다 단어의 개수와 단어의 길이를 써두는 거임.
그거는 너무 노가다라서요,
? 야 근데 내가 묻고싶은 게 1. 대체 얼마나 큰 파일을 가져와야 하길래 메모리를 그리 효율적으로 쓸 필요가 있음? 2. 그 파일은 니가 만든 거냐, 아니면 남이 만들어둔 걸 가져와서 처리하려는 거냐?
그냥 코드에 삽입해서 만들면 되는데, 그게 좀 길어요, 그래서 FILE 로 부터 입력하고 싶은건데요, 원래처럼 효율성있게요....
아니 그러니까 얼마나 기냐고; 한 1GB쯤 되냐?
크기가 픽스되어있는것은 정수형같은 숫자형이면 몰라도, 이것은 문자열이기때문에 동정할당을 할 수 밖에 없어요, 크기가 문제가 아니예요.. 크기의 변화가 심하기 때문이예요
암걸린다
3 5 apple 6 banana 3 hat
같은 방식으로.
얘가 말하는건 문자열의 길이도 그렇고 문자열의 총 갯수도 말하는거 같음. 아무것도 알 수 없는 상황에서 2차원 배열의 행열 크기를 딱맞게 하고싶대 ㅋㅋㅋ 이게 말이 되는 소리인가
파일이 주어지죠, 코드는 안고치고, 파일만 고치고 싶은거죠...
동적할당이 뭔데
동적할당으로 단어의 개수를 하나씩 더 늘리는거야? 단어의 길이를 동적으로 정하는거야?
단어의 갯수를 늘리는거예요, 단어의 길이는 무조건 동정할당이고, 단어의 갯수도 동정할당입니다.