目前正在尝试使用C I / O.我有一个只保存整数的文件,每行只有一个..不是逗号等。阅读它们的最佳方式是什么:
//WHILE NOT EOF
// Read a number
// Add to collection
我正在创建2个工作正常的文件..但最终,我想要将它们都读入,将它们连接到一个集合中,对它们进行排序然后将它们打印到新文件中。你没有必要为我做这一切,但请帮助以上...这是我迄今为止的努力:
void simpleCopyInputToOutput(void);
void getSortSave(void);
int main()
{
//simpleCopyInputToOutput();
getSortSave();
system("PAUSE");
return 0;
}
void getSortSave(void)
{
FILE *fp1;
FILE *fp2;
FILE *fpMerged;
printf("Welcome. You need to input 2 sets of numbers.\n");
printf("Please input the first sequence. Press 0 to stop.\n");
if ((fp1 = fopen("C:\\seq1.txt", "w")) == NULL)
{
printf("Cannot open or create first file!\n");
exit(1);
}
int num;
int i = 1;
while (num != 0)
{
printf("Please input value # %d\n", i);
scanf("%d", &num);
if (num == 0)
{
break;
}
fprintf(fp1, "%d\n", num);
i++;
}
printf("Please input the second sequence. Press 0 to stop.\n");
if ((fp2 = fopen("C:\\seq2.txt", "w")) == NULL)
{
printf("Cannot open or create second file!\n");
exit(1);
}
num = -1;
i = 1;
while (num != 0)
{
printf("Please input value # %d\n", i);
scanf("%d", &num);
if (num == 0)
{
break;
}
fprintf(fp2, "%d\n", num);
i++;
}
fclose(fp1);
fclose(fp2);
if ((fp1 = fopen("C:\\seq1.txt", "r")) == NULL)
{
printf("Cannot open first file!\n");
exit(1);
}
//WHILE NOT EOF
// Read a number
// Add to collection
//TODO: merge ints from both files, sort and output to new file
}
答案 0 :(得分:1)
我建议您使用fgets
:
char buffer[16];
while (fgets(buffer, sizeof(buffer), fp1))
{
long value = strtol(buffer, NULL, 10);
/* Use the value... */
}
/* fgets failed ro read, check why */
if (!feof(fp1))
printf("Error: %s\n", strerror(errno));
编辑:如何获取文件中的条目数:如果您没有以任何其他方式跟踪它(例如,将项目数作为第一行),唯一的解决方案可能是两次读取文件。一旦计算行数,一次读取实际数字。在计数后使用fseek
或rewind
将读指针“倒回”到文件的开头。
我个人将计数放在一个单独的函数中,也是实际的读数。这样,如果要从多个文件中读取,则不必重复代码。
答案 1 :(得分:1)
您的问题可以分为三个不同的部分:读取两个文件,排序数据,以及将输出写入文件。我假设这两个输入文件尚未排序。如果是这样的话,那么问题就会大大简化(如果是这样的话,google for mergesort)。
如果要打开文件进行阅读,则必须使用"r"
而不是"w"
作为文件打开模式标志。在您的示例代码中,读/写部分以某种方式与您在上面描述的内容相反。然后你应该使用fscanf从FILE *读取格式化的输入。 scanf(...)
只是fscanf(stdin, ...)
的缩写。您可以通过以下方式访问文件:
FILE *fin1 = fopen("seq1.txt", "r");
FILE *fin2 = fopen("seq2.txt", "r");
FILE *fout = fopen("out.txt", "w");
if (fin1 && fin2 && fout) {
// Do whatever needs to be done with the files.
}
if (fout)
fclose(fout);
if (fin2)
fclose(fin2);
if (fin1)
fclose(fin1);
使用动态内存来存储整数很困难。在向其中写入越来越多的数据时,需要使用realloc
来扩展缓冲区,最后使用qsort
对数据进行排序。如果需要,其他人可以希望更深入地了解这一点。