#include<stdio.h>
void sort(int *p, int size)
{
int i, j;
for (i = 0; i < size - 1; ++i)
{
for (j = 0; j < size - i - 1; ++j)
{
if (p[j] > p[j + 1])
{
int temp;
temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}
}
void createtestfile()
{
FILE *f1;
f1 = fopen("program.txt", "w");
fprintf(f1, "6#this is comment\n");
fprintf(f1, "3#this is comment\n");
fprintf(f1, "7#this is comment\n");
fprintf(f1, "2\n");
}
void readtestfile()
{
FILE *fp;
char buff[1024];
int value;
int number_of_lines;
fp = fopen("program.txt", "r");
do
{
fgets(buff, 1024, fp);
fscanf(fp, "%d", &value);
number_of_lines++;
buff[number_of_lines] = value;
} while (fp != EOF);
sort(buff, number_of_lines);
int i;
for (i = 1; i < number_of_lines; i++)
{
printf("value is %d", buff[i]);
}
}
int main()
{
createtestfile();
readtestfile();
return 0;
}
我正在为文件写一个字符串。稍后只读取文件中的整数并按升序对它们进行排序。我正在使用fgets从文件中逐行读取,我在从文件中只读取整数时遇到问题。
答案 0 :(得分:1)
在写入文件后,您将丢失关闭文件。
由于这个内容最适合在应用程序结束时写入,因为当时将隐式地删除。
添加
fclose(f1)
在fprintf()
中的最后一次createtestfile()
之后。
其次,当从文件中读取时,您应该决定是否使用fgets()
fscanf()
来读取数据。
或者,您可以使用fscanf()
直接从文件中读取,从使用sscanf()
读取的“字符串”中执行fgets()
。
为此,请替换
fscanf(fp, "%d", &value);
带
sscanf(buff, "%d", &value);
第三,尝试将您扫描的内容从buff
写回buff
是没有意义的,至少因为您在下一轮读取循环中覆盖了buff
。
此外,您将buff
传递给sort()
,这会让编辑器大声喊出警告。
将循环计数器number_of_lines
正确初始化为0
,并使用整数数组存储从文件内容中扫描的值。然后,您可以将其传递到sort()
。
答案 1 :(得分:0)
fgets
消费行,您必须在sscanf
之后使用fscanf
代替fgets
do
{
fgets(buff, 1024, fp);
fscanf(fp, "%d", &value); /* here */
答案 2 :(得分:0)
只是为了您的知识,您可以使用内置排序函数qsort对数据进行排序。
以下是一个例子:
#include <stdio.h> /* printf */
#include <stdlib.h> /* qsort */
int values[] = { 40, 10, 100, 90, 20, 25 };
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main ()
{
int n;
qsort (values, 6, sizeof(int), compare);
for (n=0; n<6; n++)
printf ("%d ",values[n]);
return 0;
}