我有一个奇怪的错误,我附加的文本被添加到文件的开头而不是它的结尾。这最终会使一切都倒退。
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。
答案 0 :(得分:2)
我想你遇到的问题是由于每次调用writeFile
都会打开文件的新句柄,写入文件然后返回。一旦你完成了文件句柄的使用,你应该关闭它,这会将文件缓冲区刷新到文件并释放句柄。
我认为这里发生的是你每次都要打开一个新手柄,而且每个手柄都只写入少量数据,所以不会被刷新到磁盘上。您的程序然后退出,操作系统正在清理过时的文件句柄将它们刷新到磁盘。作为猜测,我想它正在以相反的顺序进行清理,因此您的文件的外观会被倒退。
更新您的writeFile
以包含关闭,希望能解决问题
FILE *out = fopen(raidName, "a");
fprintf(out, "%s", buffer);
fclose(out);
如果你打开文件写入循环调用writeFile
并传递句柄,那么你可能会更好,然后你只需打开它并关闭它一次。
值得添加在其他地方关闭,你也打开了文件。
HTH
答案 1 :(得分:1)
我还看到你在检查值(k)中使用scanf的局部变量地址,这些只是本地的,永远不会反映在Main()中