텍스트 파일 (가변 폭)에서 여러 라인을 읽고 C 문자열 모두를 어떻게 저장할 수 있습니까?파일에서 C로 된 문자열로 복수 라인 읽기
편집 : 나는 문자열을 fget'ing하고 (realloc을 통해) 하나의 유연한 버퍼에 저장하는 것 같아요 :) 또한 이것은 분명히 그렇게 보이지만 숙제가 아닙니다 (프로그래밍은 나에게 취미 일뿐입니다.). 나는 방금 호기심을 묻는 중이었습니다
텍스트 파일 (가변 폭)에서 여러 라인을 읽고 C 문자열 모두를 어떻게 저장할 수 있습니까?파일에서 C로 된 문자열로 복수 라인 읽기
편집 : 나는 문자열을 fget'ing하고 (realloc을 통해) 하나의 유연한 버퍼에 저장하는 것 같아요 :) 또한 이것은 분명히 그렇게 보이지만 숙제가 아닙니다 (프로그래밍은 나에게 취미 일뿐입니다.). 나는 방금 호기심을 묻는 중이었습니다
여기서 초기 버퍼를 생성 일반 과정
을 추가, 여기에 내가 그것을 할 거라고 방법에 대한 몇 가지 샘플 코드입니다. 난 결국 전체 파일을위한 거대한 메모리 블록을 할당하고있다. 어쨌든 모든 것을 읽을 것이기 때문에 큰 파일을 다루는 경우에는 한 번에 한 라인 씩 처리하는 것이 더 좋다.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
// first, get the name of the file as an argument
if (argc != 2) {
printf("SYNTAX: %s <input file>\n", argv[0]);
return -1;
}
// open the file
FILE* fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("ERROR: couldn't open file\n");
return -2;
}
// seek to the end to get the length
// you may want to do some error-checking here
fseek(fp, 0, SEEK_END);
long length = ftell(fp);
// we need to seek back to the start so we can read from it
fseek(fp, 0, SEEK_SET);
// allocate a block of memory for this thing
// the +1 is for the nul-terminator
char* buffer = malloc((length + 1) * sizeof(char));
if (buffer == NULL) {
printf("ERROR: not enough memory to read file\n");
return -3;
}
// now for the meat. read in the file chunk by chunk till we're done
long offset = 0;
while (!feof(fp) && offset < length) {
printf("reading from offset %d...\n", offset);
offset += fread(buffer + offset, sizeof(char), length-offset, fp);
}
// buffer now contains your file
// but if we're going to print it, we should nul-terminate it
buffer[offset] = '\0';
printf("%s", buffer);
// always close your file pointer
fclose(fp);
return 0;
}
필자는 C 코드를 작성한 지 오래되었습니다. 사람들은 도움이되는 교정/거대한 문제에 대한 고지를 통해 전화를 걸기를 바랍니다. :)
흥미로운 해결책입니다 ... 방금 나에게 아이디어를주었습니다. 내 파일 전체에 일부 구분 기호가 있습니다 ...파일을 미리 스캔하고 구분 기호 목록을 작성한 다음 다시 목록을 사용하여 메모리를 할당 할 수 있습니다 (두 구분자의 위치 차이는 두 문자열 사이의 문자열 크기 임). 감사합니다. – pwseo
'fseek' +'ftell' +'fseek' 대신에'fstat'로 파일 길이를 얻는 것은 어떻습니까? –
당신은 여기에 "가변 길이"문자열 구현을 시도 할 수 있습니다 :
How to implement a variable-length ‘string’-y in C
를 그리고, 당신은 문자열로 "추가"쓰기 작업을해야합니다. 그런 다음 안전하게 모든 바이트 청크를 읽고 이미 읽은 것과 연결합니다.
나는 과거에 가변 길이 문자열 유형을 구현 했으므로 대신 그 문자열을 사용할 예정이지만 어쨌든 Baltasarq :) – pwseo
이 숙제가 있습니까? 우리에게 보여줄 수있는 것을 시도 했습니까? 공유 할 세부 사항이 더 있습니까? – Cogwheel
아니요, 숙제가 아닙니다. 그냥 즐겁게 (내 연구는 건강 관리에있어) 나는 fgets로 문자열을 읽은 다음 하나의 마지막 문자열로 함께 strcat'ing하는 것을 생각했지만보다 효율적인 방법이 있는지 알고 싶었다. 가능한 답글을 읽는 동안 나는 그것을 시험해 볼 것이다. :) – pwseo