【发布时间】:2016-09-19 04:37:54
【问题描述】:
第一次 C 编程课并开始学习编程。我目前正在学习如何在 C 中使用文件输入/输出,这是一项有助于理解此过程的学习任务。
该任务要求程序使用具有随机美国地址的输入文件,然后按邮政编码从小到大的顺序输出地址。由于程序现在没有崩溃,但我得到一个空的输出文件。我可能知道出了什么问题。我相信我必须告诉程序/函数何时开始读取输入文件,然后何时写入,最后何时关闭文件。可能在某处使用“while”语句?
需要什么以及在哪里让这个程序将地址输出到文件中?任何人都可以推荐一个可以添加的函数/语句来实现这一点吗?
非常感谢您为使该程序正常运行所提供的帮助、时间和指导!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFF_SIZE 32
#define STRUCT_SIZE 512
struct info {
char name[BUFF_SIZE];
char stAddress[BUFF_SIZE];
char cityAndState[BUFF_SIZE];
char zip[BUFF_SIZE];
};
void selectionSort(struct info *ptrStruct[], int size);
int main(int argc, char *argv[]) {
FILE *fpin, *fpout;
int count, size;
char buffer[512];
struct info *ptrStruct[STRUCT_SIZE];
if (argc != 3) {
printf("Usage: program, inputfile, outputfile\n");
exit(1);
}
if ((fpin = fopen(argv[1], "r")) == NULL) {
printf("Can't open input file\n");
exit(1);
}
if ((fpout = fopen(argv[2], "w")) == NULL) {
printf("Can't open output file\n");
exit(1);
}
for (count = 0; count < STRUCT_SIZE; count++){
ptrStruct[count] = (struct info*) malloc(sizeof(struct info));
if (EOF == scanf("%599[^\n]%*c", buffer)){
free(ptrStruct[count]);
break;
};
strcpy(ptrStruct[count]->name, buffer);
scanf("%511[^\n]%*c", buffer);
strcpy(ptrStruct[count]->stAddress, buffer);
scanf("%511[^\n]%*c", buffer);
strcpy(ptrStruct[count]->cityAndState, buffer);
scanf("%511[^\n]%*c", buffer);
strcpy(ptrStruct[count]->zip, buffer);
}
size = count;
selectionSort(ptrStruct, size);
printf("\n\nLEAST TO GREATEST\n");
for (count = 0; count < size; count++)
{
printf("%s\n", ptrStruct[count]->name);
printf("%s\n", ptrStruct[count]->stAddress);
printf("%s\n", ptrStruct[count]->cityAndState);
printf("%s\n", ptrStruct[count]->zip);
free(ptrStruct[count]);
}
fclose(fpin);
fclose(fpout);
}
void selectionSort(struct info *ptrStruct[], int size)
{
int count1, count2;
int minIndex;
struct info *ptrTemporary;
for (count2 = 0; count2 < size - 1; count2++)
{
minIndex = count2;
for (count1 = count2 + 1; count1 < size; count1++)
{
if (strcmp(ptrStruct[count1]->zip, ptrStruct[minIndex]->zip) < 0)
minIndex = count1;
}
if (minIndex != count2){
ptrTemporary = ptrStruct[count2];
ptrStruct[count2] = ptrStruct[minIndex];
ptrStruct[minIndex] = ptrTemporary;
}
}
}
使用的输入:
A1, A2
20294 Lorenzana Dr
Woodland Hills, CA
91364
B1, B2
19831 Henshaw St
Culver City, CA
94023
C1, C2
5142 Dumont Pl
Azusa, CA
91112
D1, D2
20636 De Forest St
Woodland Hills, CA
91364
A1, A2
20294 Lorenzana Dr
Woodland Hills, CA
91364
E1, E2
4851 Poe Ave
Woodland Hills, CA
91364
F1, F2
20225 Lorenzana Dr
Los Angeles, CA
91111
G1, G2
20253 Lorenzana Dr
Los Angeles, CA
90005
H1, H2
5241 Del Moreno Dr
Los Angeles, CA
91110
I1, I2
5332 Felice Pl
Stevenson Ranch, CA
94135
J1, J2
5135 Quakertown Ave
Thousand Oaks, CA
91362
K1, K2
720 Eucalyptus Ave 105
Inglewood, CA
89030
L1, L2
5021 Dumont Pl
Woodland Hills, CA
91364
M1, M2
4819 Quedo Pl
Westlake Village, CA
91362
I1, I2
5332 Felice Pl
Stevenson Ranch, CA
94135
I1, I2
5332 Felice Pl
Stevenson Ranch, CA
94135
N1, N2
20044 Wells Dr
Beverly Hills, CA
90210
O1, O2
7659 Mckinley Ave
Los Angeles, CA
90001
【问题讨论】:
-
%*c 中的 * 不会抑制在 scanf 调用中将值分配给缓冲区吗?
-
"%599[^\n]%*c"-->"%511[^\n]%*c",scanf-->fscanf,printf->fprintf. -
@BLUEPIXY:谢谢!我忘了删除那条评论