文本将附加在文件的开头而不是文件的末尾

时间:2017-11-22 22:40:30

标签: c file append

我有一个奇怪的错误,我附加的文本被添加到文件的开头而不是它的结尾。这最终会使一切都倒退。

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:

mmmmiiiieeeeaaaa

应该写什么到raid1.txt:

aaaaeeeeiiiimmmm

我尝试过使用fseek但无济于事。如果有人可以帮助我或指出我正确的方向,这将有所帮助。这是在C中使用bash编译和运行程序完成的。传递的参数是test.txt 4 0 4。

2 个答案:

答案 0 :(得分:2)

我想你遇到的问题是由于每次调用writeFile都会打开文件的新句柄,写入文件然后返回。一旦你完成了文件句柄的使用,你应该关闭它,这会将文件缓冲区刷新到文件并释放句柄。

我认为这里发生的是你每次都要打开一个新手柄,而且每个手柄都只写入少量数据,所以不会被刷新到磁盘上。您的程序然后退出,操作系统正在清理过时的文件句柄将它们刷新到磁盘。作为猜测,我想它正在以相反的顺序进行清理,因此您的文件的外观会被倒退。

更新您的writeFile以包含关闭,希望能解决问题

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

如果你打开文件写入循环调用writeFile并传递句柄,那么你可能会更好,然后你只需打开它并关闭它一次。

值得添加在其他地方关闭,你也打开了文件。

HTH

答案 1 :(得分:1)

我还看到你在检查值(k)中使用scanf的局部变量地址,这些只是本地的,永远不会反映在Main()中