2011-04-19 10 views
0

파일에서 한 줄을 지우고 싶습니다. 현재 각 줄에 대해 oldTodoFile으로 반복하고, lineNumbertodoNumber과 같지 않으면 새 파일 (todoFile)에 추가하십시오. 선을 삭제하는 좋은 방법이 아닌 것 같은데 선을 제거하는 더 좋은 방법이 있습니까?파일에서 행을 제거하는 더 나은 방법은?

FILE *oldTodoFile; 
oldTodoFile = fopen("./todo.txt", "r"); 

FILE *todoFile; 
todoFile = fopen("./todo2.txt", "w"); 
int lineNumber = 0; 
int len; 
char line[4096]; 

if (oldTodoFile != NULL) { 
    while (fgets(line, sizeof line, oldTodoFile)) { 
     len = strlen(line); 
     if (len && (line[len - 1] != '\n')) {} else { 
      lineNumber++; 
      if (lineNumber == todoNumber) { 
       // Do nothing 
      } else { 
       fputs(line, todoFile); 
      } 
     } 
    } 
} else { 
    printf("ERROR"); 
} 
remove("./todo.txt"); 
rename("./todo2.txt", "./todo.txt"); 
fclose(oldTodoFile); 
fclose(todoFile); 
+1

매우 유사 : http://stackoverflow.com/questions/1151713/delete-a-line-from-a-file-in-c-language –

+0

검색에 나오지 않았습니다. http : // stackoverflow. co.kr/search? q = 더 나은 방법 + + + 제거 + a + 라인 + in + a + 파일 % 3F – errorhandler

답변

3

파일은 일련의 바이트입니다. 한 줄을 지우고 싶다면 그 줄 뒤의 모든 것을 옮겨야합니다. 나는 당신이하고있는 일을 잘하고 있다고 생각하지만, 제거하고있는 라인부터 시작해서 파일을 덮어 쓸 수도있다.

이렇게하려면 파일을 가리키는 두 개의 파일 설명자가 필요합니다. 두 번째 책을 읽으면서 첫 번째 책에 글을 쓸 것입니다.

작업이 끝나면 파일을 자르면 마지막에 여분의 데이터가 제거됩니다.

1

아니, 그렇게하는 방법입니다. 파일 중간에서 데이터를 삭제할 방법이 없습니다.

오류가 발생해도 코드를 수정하고 마지막에 삭제/이름 바꾸기를 시도합니다.

0

OS가 메모리 매핑 파일을 지원하는 경우 파일 맵핑을 한 다음 memmove()를 사용하여 데이터를 이동할 수 있습니다. 더 효율적일 수도 있고 그렇지 않을 수도 있지만 결과 코드는 구현, 유지 및 디버그하는 것이 더 간단 할 수 있습니다.

반드시 "더 나은"방법은 아니지만 고려해야 할 사항입니다.

관련 문제