gpt4 book ai didi

c - 文本被 append 在文件的开头而不是文件的末尾

转载 作者:太空宇宙 更新时间:2023-11-04 06:53:57 25 4
gpt4 key购买 nike

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

代码:

#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。

最佳答案

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

我认为这里发生的情况是您每次都打开一个新句柄,并且每个句柄都只写入少量数据,因此不会刷新到磁盘。然后您的程序正在退出,操作系统正在清理陈旧的文件句柄,将它们刷新到磁盘。作为一种猜测,我想它正在以相反的顺序进行清理,因此您的文件看起来是倒着写的。

更新您的 writeFile 以包括关闭,希望这可以解决问题

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

如果您在调用writeFile 的循环中打开要写入的文件并传递句柄,那么您只需要打开它并关闭它一次,这可能会更好。

值得在其他地方添加关闭,您也可以在其他地方打开文件。

HTH

关于c - 文本被 append 在文件的开头而不是文件的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47444961/

25 4 0
文章推荐: c - 是否必须将未定义的行为定义为未定义?
文章推荐: java - 瓦丁 : CustomLayout don't generate
文章推荐: c - 未检测到 EOF
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com