所以我的第一个问题是,如何使用Xcode和终端在Mac上进行文件输入/输出程序?
其次,直到我弄明白,有人会介意这是否正确,因为我目前无法编译并运行它?我打算在本周对我的驱动器进行分区并将窗口放在上面但是在那之前我想学习我的考试。
以下是练习题: 编写一个程序,从第一行读入一个整数n,然后在n个后续行中读取每行两个东西(一个int SSN和一个浮动工资收入)。所有这些都是一个文件。您必须提示输入文件名为一个长度小于30个字符的字符串。打开文件等,阅读所有内容,并保持所有工资的总计,然后在阅读完成后,提示输出文件名字符串,打开它并写下所有收入的平均值。
这是我的代码:
#include <stdlib.h>
#include <stdio.h>
FILE *F1, *F2;
void main () {
int SSN, n, i;
float wages, total;
char f1name, f2name;
scanf("%s", &f1name);
F1 = fopen("f1name", "r");
fscanf(F1,"%d", &n);
{
// Reading in the
for(i=0; i<n; i++)
{
fscanf(F1,"%d%f", &SSN, &wages);
total += wages;
}
// Scanning in file name and opening it
scanf("%s", &f2name);
F2 = fopen(fname, "w");
// Writing to the file the average of all earnings
fprintf(F2,"%d%f", SSN, total/n);
}
// Closing the file
fclose(F1);
fclose(F2);
}
答案 0 :(得分:1)
f1name
和f2name
应该是存储文件名的字符数组。您已将它们定义为字符,并尝试在其中存储字符串将调用未定义的行为,因为scanf
将执行非法内存访问。
此外,main
函数的签名应该是以下任何一种。
int main(void);
int main(int argc, char *argv[]);
您应该将程序修改为
#include <stdio.h>
#include <stdlib.h>
int main(void) {
// variable name SSN change to lowercase
int ssn, n, i;
int retval; // to save the return value of fscanf
float wages, total;
char f1name[30+1], f2name[30+1];
// define file pointers inside main
// also change the name to lowercase
FILE *f1, *f2;
scanf("%30s", f1name);
f1 = fopen(f1name, "r");
// check for error in opening file
if(f1 == NULL) {
// print error message to stderr
perror("error in opening file\n");
// handle it
}
retval = fscanf(f1, "%d", &n);
if(retval != 1) {
perror("error in reading from the file\n");
// handle it
}
for(i = 0; i < n; i++) {
retval = fscanf(f1,"%d%f", &ssn, &wages);
if(retval != 2) {
perror("error in reading from the file\n");
// handle it
}
total += wages;
}
scanf("%30s", f2name);
f2 = fopen(f2name, "w");
// check for error in opening file
if(f2 == NULL) {
// print error message to stderr
perror("error in opening file\n");
// handle it
}
// Writing to the file the average of all earnings
fprintf(f2,"%d %f", ssn, total / n);
// Closing the file
fclose(f1);
fclose(f2);
return 0;
}