正如标题所述,我试图从外部文本文件中读取数字并将它们分配给数组。如果我手动创建数组,我能够操作数组并将结果写入另一个文件,但是fscanf()
正在从文本文件中提取垃圾。这就是我现在所拥有的,我一直在阅读其他帖子,我现在已经改变了12次,但我认为我离解决方案越来越远了。
filename = argv[1];
FILE *fp;
fp = fopen(filename, "r");
if (fp == NULL) {
printf("\n Unable to open input file.\n\n");
helpmssg();
exitmssg();
}
while (getc(fp) != EOF){
if (fscanf(fp,"%d", &c) == 1) {
arr[i] = c;
i++;
}
}
理想情况下,这应该扫描指定为数字的命令行参数的文件,将其分配给数组的第一个点,然后重复直到文件末尾。非常感谢任何帮助。
文字档案:
12
23
99
66
47
2
-111
8
按要求添加整个主要功能:
void main(int argc,char** argv) {
char* filename;
char* outputfile;
char conf;
int arr[1000] = {0};
int n,a=0,d=0,h=0,i=0,c=0;
welcome();
if (argc > 4 || argc < 3) {
printf("\n Invalid number of arguments.\n\n");
helpmssg();
exitmssg();
}
else if (argc == 4) {
for (int i=3;i<argc;i++) {
if (argv[i][0] == '-') {
for(int z=1;z<strlen(argv[i]);z++) {
if (argv[i][z] == 'a') {
a=1;
}
else if (argv[i][z] == 'd') {
d=1;
}
else if (argv[i][z] == 'h') {
h=1;
}
else {
printf("\n Invalid options in 3rd argument.\n\n");
helpmssg();
exitmssg();
}
}
}
else {
printf("\n 3rd argument shoule begin with '-'\n\n");
helpmssg();
exitmssg();
}
} }
filename = argv[1];
FILE *fp;
fp = fopen(filename, "r");
if (fp == NULL) {
printf("\n Unable to open input file.\n\n");
helpmssg();
exitmssg();
}
while ((c=getc(fp)) != EOF){
ungetc (c,fp);
if (fscanf(fp,"%d\n", &c) == 1) {
arr[i] = c;
i++;n++;
}
}
// int arr[] = {64, 34, 25, 12, 22, 11, 90};
sort(arr, n,d);
printf("Sorted array: \n");
printArray(arr, n);
outputfile = argv[2];
fp = fopen(outputfile, "r");
if (fp != NULL ) {
printf("\n Output file already exists, would you like to overwrite it?: Y/N \n\n");
scanf("%c", &conf);
if (conf == 'N' || conf == 'n') {
helpmssg();
exitmssg();
} else {printf(" Overwritting...\n\n");}
}
fclose(fp);
fp = fopen(outputfile, "w");
for (i=0; i < n; i++) {
fprintf(fp,"%d\n",arr[i]);
}
exitmssg();
}
答案 0 :(得分:1)
你可以做到
for(i=0; i<size ; ++i)
{
if( fscanf(fp, "%d", &arr[i])!=1 )
{
printf("\nSomething went wrong.");
break;
}
}
其中size
是数组中存储的数字的数量。
使用fscanf()
逐行读取每行中的整数。它返回成功分配的数量,在这种情况下,在循环的每次迭代中应该是1
。
在你的程序中,首先使用getc()
,它读取一个字符,然后使用fscanf()
,只读取其余字符。
答案 1 :(得分:0)
将while (getc(fp) != EOF)
更改为while ((c = getc(fp)) != EOF)
。
在循环中和if语句之前在其下方添加ungetc (c, fp);
。
将if (fscanf(fp,"%d", &c) == 1) {
更改为if (fscanf(fp,"%d\n", &c) == 1) {