2010-04-12 3 views
3

일종의 소셜 네트워크 인 제가하고있는이 대학 프로젝트 (제가 과거에 몇 개의 게시물을 만들었습니다) 사용자가 메시지를 교환 할 수 있어야합니다.파일 입출력 (메시지 문자열 읽기/쓰기)에 대한 많은 질문이 있습니다.

처음에는 모든 메시지를 링크 된 목록에 보관하도록 데이터 구조를 설계하여 메시지 크기를 256 자로 제한했습니다. 그러나 디스크에 메시지를 저장하고 필요할 때만 읽을 경우 강사가 선호한다고 생각합니다. 물론, 그들은 그들이 무엇을 선호하는지 말하지 않을 것이며, 나는 선택의 여지를두고 최선을 정당화해야만 내가 그 길을 갔다.

더 이상 각 사용자의 최근 20 개 메시지 만 저장하면됩니다.

지금은받은 편지함 역할을하는 해시 테이블이 있는데, 이것은 사용자 프로필 내에 있습니다. 이 해시 테이블은 이름 (메시지를 보낸 사용자)에 의해 인덱싱됩니다. 각 요소의 값은 배열이 12 개의 요소 (위에서 말한 20 개의 메시지)를 갖는 size_t의 배열을 유지합니다. 아이디어는 쓰여진 디스크 파일 오프셋과 바이트를 추적하는 것입니다. 그런 다음 메시지를 읽어야 할 때 fseek()을 사용하고 필요한 바이트를 읽어야합니다.

나는 이것이 잘 작동 할 수 있다고 생각한다 ... 네트워크의 모든 사용자가 보낸 모든 메시지를 보관할 단일 파일을 사용할 수있다. 저는 한 명씩 한 파일을 말하고 있습니다. 왜냐하면 동료가 강사에게 각 사용자의 메시지를 독립적으로 저장하는 것에 대해 물었 기 때문에 그는 파일 시스템이 한계가 있기 때문에 최선의 방법이 아닐 수도 있다고 대답했습니다. 그래서 내가 단일 파일 경로를 선택하려고합니다.

그러나이 문제는 ... 최근 20 개의 메시지 만 저장해야하므로이 제한에 도달하면 이전 메시지를 삭제해야합니다.

어떻게 해야할지 모르겠지만 ... 내가 아는 전부는 파일에서 바이트를 읽고 쓰는 데 약 fread()fwrite()입니다. 파일 오프셋에 가서 "다음 X 바이트를 삭제하십시오"라고 어떻게 말할 수 있습니까? 내가 할 수있는 경우에도 또 다른 문제가 있습니다 ... 그 아래에있는 모든 오프셋은 완전히 다르며 문제를 해결하기 위해 모든 사용자 사서함을 처리해야합니다. 어떤 고통을 것입니다 ...

그럼, 내 제안을 해결하기 위해 어떤 제안? 너는 무엇을 제안 하는가?

답변

2

파일 중간에서 바이트를 임의로 삭제할 수 없습니다. 작동하는 유일한 방법은 파일없이 전체 파일을 다시 쓰는 것입니다. 이 방법으로 일하는지의 여부를 무시하는 것은 좋은 생각입니다. 고정 길이 필드가 있다면, 한 가지 해결책은 단지 일 것입니다. 가장 오래된 메시지를 최신 것으로 덮어 씁니다. 그런 식으로 디스크의 메시지 크기/위치는 변경되지 않으므로 다른 오프셋은 영향을받지 않습니다.

편집 : 외부 라이브러리를 사용할 수 있다면 간단한 SQLite db를 만드는 것이 좋은 해결책이 될 수 있습니다.

+0

그게 내가 생각한 ... 나는 메시지에 고정 길이를 사용하는 아이디어를 좋아하지 않는다. 최대 값은 256이지만 메시지가 단순한 "안녕하세요, 어떻게 지내세요?"라면 256 바이트를 쓰고 싶지 않습니다. 그리고 나는 그런 외부 libs를 사용할 수 있습니다. 그것은 목적을 이길 것입니다 ... –

0

당신은 당신의 인생을 당신보다 더 복잡하게 만듭니다.

메시지가 256 자이면 256 자의 배열을 사용하여 각 메시지를 보관하십시오.

fwrite를 사용하여 디스크에 기록하고 fread로 읽은 다음 문자열의 첫 번째 문자를 \ 0 (또는 다른 항목이 마음에 드는 항목)으로 변경하여 삭제하고 디스크에 기록합니다.

간단한 구조 (사용자 이름/recno)로 메시지의 색인을 유지하고 fseek를 사용하여 파일에서 바운스합니다.새 레코드를 작성할 때 (파일의 시작 부분에서 읽기를 시작하고 \ 0을 누를 때 멈추기) 또는 배열에 사용 가능한 레코드의 인덱스를 유지하고 쓰기 중 하나를 가져올 수 있습니다 새가 (배열이 비어있는 경우 또는 다음 파일의 끝에 fseek의와 완전히 새로운 기록을 작성합니다.)

+0

나는 당신의 답을 대부분 얻지 못했고 당신이 문제를 올바르게 이해했다고 생각하지 않습니다. 내가 말할 수있는 한 가지는 256 자의 배열을 사용하고 싶지 않고 메시지를 메모리에 저장하고 싶지 않다는 것입니다. 그것이 첫 번째 접근이었습니다. 그게 제가 피하려고하는 것입니다. 이것은 한 명의 사용자를위한 하나의 메시지가 아니라 수천 명의 사용자를위한 20 개의 메시지 (최대 과정)입니다. –

+0

활성 메시지를 어딘가에 넣어야하므로 256 자 배열로 들어갑니다. 메시지가 10 문자 만 길어도 하나의 256 자 레코드로 디스크에 배열을 저장하십시오. 그런 다음 recno *를 검색하여 쉽게 다시 찾을 수 있습니다. recno와 발신자를 간단한 구조로 유지하여 원하는 경우, 램 또는 다른 디스크 파일에 배열을 유지할 수 있습니다. 나는 그것에 대해 불분명 한 것이 보이지 않는다. 고정 길이 문자 스트링과 별도의 색인 배열을 가진 단순 임의 액세스 파일. –

+0

내가 말했듯이, 나는 맘에 안 들거나 원하지 않는다. 각 메시지에 대해 256 바이트를 저장하지 않을 것입니다. 몇 바이트 만 저장해야합니다 (실제로 메시지가 작 으면). 그것은 공간 낭비입니다. –

0

을 내가 완전성에 대해 다른 해결책을 제시 할 '술 :

문자열로 끝나는되어야한다 null-byte 문자 인 "hello world\0"이므로 "\0"에 도달 할 때까지 원시 2 진 데이터를 읽을 수 있습니다. 다른 데이터 유형에는 고정 비트가 있으며 바이트 순서 (엔디안)를 유의하십시오.

는 또한 각 메시지 전에 페이로드를 정의 할 수 있습니다, 그래서 당신은 문자열 길이를 알고

"11hello world;2hi;15my name is loco" 

는 따라서 가능한 데이터 필드와 같은 원시 조각을 처리 할 수있다.