2017-11-22 3 views
0

추가하는 텍스트가 파일의 끝 부분에 추가되는 이상한 버그가 있습니다. 결국 모든 것을 거꾸로 만듭니다.파일 끝에 파일 대신 끝에 텍스트가 추가됩니다.

CODE :

#include <stdio.h> 
#include <stdlib.h> 

//Check Values 
void checkValues(int numDisks, int raidType, int chunkSize){ 
    while (numDisks < 1 || numDisks > 9){ 
     printf("Number inputed for numDisks is not valid, please enter a new value (1-9).\n"); 
     scanf("%d", &numDisks); 
    } 
    while(raidType < 0 || raidType > 1){ 
     printf("Number inputed for raidType is not valid, please enter a new value (0-1).\n"); 
     scanf("%d", &raidType); 
    } 
    while(chunkSize < 1 || chunkSize > 512){ 
     printf("Number inputed for chunkSize is not valid, please enter a new value (1-512).\n"); 
     scanf("%d", &chunkSize); 
    } 
} 

//CreateFile 
void createFile(int numDisks){ 
    char raidName[5]; 
    int counter = 1; 

    //Create each file 
    while(counter != numDisks + 1){ 
     sprintf(raidName, "raid%d", counter);  //Append counter to string 

     FILE *out = fopen(raidName, "w");        
     counter++; 
    } 
} 

//Write File 
void writeFile(int numDisks, char *buffer, int counter){ 
    char raidName[5]; 

    sprintf(raidName, "raid%d", counter);  //Append counter to string 

    //Write File 
    FILE *out = fopen(raidName, "a"); 
    fprintf(out, "%s", buffer);  
} 

//Read and Write Files 
void rwFile(const char *fileName, int chunkSize, int numDisks){ 
    char buffer[10000]; 
    int counter = 1; 

    //Reading File 
    FILE *in = fopen(fileName, "r");  
    if(in == NULL) return; 

    //Create File 
    createFile(numDisks); 

    while(fgets(buffer, chunkSize + 1, in) != NULL){ 
     //Reset Counter 
     if(counter > numDisks){ 
      counter = 1; 
     } 

     writeFile(numDisks, buffer, counter); 
     counter++; 
    } 
} 

int main(int argc, const char *argv[]){ 
    //Declarations 
    const char *fileName = argv[1]; 
    int numDisks = atoi(argv[2]); 
    int raidType = atoi(argv[3]); 
    int chunkSize = atoi(argv[4]); 

    checkValues(numDisks, raidType, chunkSize); 
    rwFile(fileName, chunkSize, numDisks); 
} 

raid1.txt :

raid1.txt을 작성해야 무엇
mmmmiiiieeeeaaaa 

:

aaaaeeeeiiiimmmm 
내가 fseek과를 사용하여 시도

하지만 아무 소용이

. 누군가가 나를 도와 주거나 올바른 방향으로 나를 가르키면 도움이 될 것입니다. 이것은 C에서 bash를 사용하여 프로그램을 컴파일하고 실행합니다. 전달 된 인수는 test.txt입니다. 4 0 4.

+0

@ikegami의 I 미안하지만 아직도 조금. 캐리지 리턴이 보이지 않습니까? 당신이 \ r을 사용하면 그게 아닌가요? – DazedFury

답변

2

내가보고있는 문제는 writeFile에 대한 각 호출로 인해 파일에 대한 신선한 핸들을 열고 파일에 기록한 다음 반환하는 것입니다. 파일 핸들 사용을 끝내면 파일 버퍼를 파일로 플러시하고 핸들을 비 웁니다.

내가 여기에서 생각하는 것은 매회 신선한 핸들을 여는 것이며 이들 각각에는 적은 양의 데이터 만 기록되므로 디스크로 플러시되지 않는다는 것입니다. 그러면 프로그램이 종료되고 OS가 오래된 파일을 정리하여 디스크로 플러시 처리합니다. 추측 하건대 내가 역순으로 정리하는 것을 상상해보십시오. 따라서 파일이 거꾸로 쓰여진 것처럼 보입니다.

업데이트합니다 writeFile 당신을 가까운 잘하면 그 문제

FILE *out = fopen(raidName, "a"); 
fprintf(out, "%s", buffer); 
fclose(out); 

당신이 writeFile를 호출하는 루프에 쓰기 위해 파일을 열고이 끝난 처리 통과하면 그것은 더 좋은 수 있습니다를 해결해야하고,을 포함 그것을 열어 한 번 닫을 필요가 있습니다.

추가 할 때마다 추가로 파일을 열었습니다.

HTH

+0

굉장! 잘됐다. 무리 감사! – DazedFury

1

나는이 지역은 결코 홈페이지에 반영 될 것입니다, 당신은 체크 값 scanf와 로컬 변수 (K)의 주소를 사용 참조 한가지 더()

+0

아하 네 말이 맞아. 아마 전역 변수를 사용하고 싶지는 않습니다. 메인의 값을 확인해야 할 것 같네요? – DazedFury

관련 문제