我在一个文本文件中有一个80370长的30位数字列表,每个都在一个单独的行中 我想用C对它们进行排序。
我的想法是创建一个新文件,然后将第一个数字添加到其中 然后,每次我们将它与另一个数字进行比较。如果它更小,则追加另一个数字。简单。但是,如果它更大,则必须预先添加新号码 我尝试过这样的前缀:
void prepend(char line[], FILE* w, FILE* waux, char filename[], char auxname[]) {
fprintf(waux, "%s\n", line); //print new number to new file (waux)
char ch;
while((ch = fgetc(w)) != EOF) {
fputc(ch, waux); //read old file (w) and add to new file (waux)
}
remove(filename); //delete old file
rename(auxname, filename); //rename new file to old file's name
}
然后我尝试读取输出并填充NULL字符(在Notepad ++中) 在百万个空字符中,我们可以找到数字,但它们根本没有排序。
答案 0 :(得分:3)
虽然我同意您应该使用malloc
为所有数据分配内存的注释,然后对内存中的数据进行排序,然后将数据写入文件,我也认为您的方法也应该有效。
我猜你的方法不起作用的原因是你在使用时有文件的打开文件句柄
remove(filename); //delete old file
rename(auxname, filename); //rename new file to old file's name
我的建议:
void prepend(char line[], char filename[], char auxname[]) {
FILE* w = fopen(filename, "r");
if ( w == NULL )
{
fprintf(stderr, "Unable to open %s for reading from.\n", filename);
return;
}
FILE* waux = fopen(auxname, "w");
if ( waux == NULL )
{
fprintf(stderr, "Unable to open %s for writing to.\n", auxname);
fclose(w);
return;
}
fprintf(waux, "%s\n", line); //print new number to new file (waux)
int ch;
while((ch = fgetc(w)) != EOF) {
fputc(ch, waux); //read old file (w) and add to new file (waux)
}
fclose(waux);
fclose(w);
remove(filename); //delete old file
rename(auxname, filename); //rename new file to old file's name
}