将文件保存到结构
Save file to struct
我需要读取文件并将其保存到结构中。
文件输入示例:
Aaaaa Aaaaa 2010 999.00 999.00 999.00 999.00 999.00
Bbbbb Bbbbbbb 2012 1001.00 1001.00 1001.00 1001.00 1001.00
Cccc Ccccccccc 2010 1001.00 1001.00 1001.00 1001.00 1001.00
代码:
#include <stdio.h>
struct Worker {
char name[20], surname[20];
int year;
double salary[5];
} arr[1000];
int number_of_workers = 0;
void load() {
FILE *input = fopen("input.txt", "r");
int i = 0, j;
while (i < 1000) {
fscanf(input, "%s %s %d\n", arr[i].name, arr[i].surname, arr[i].year);
i++;
for (j = 0; j < 5; j++)
fscanf(input, "%d ", arr[i].salary[j]);
if (feof(input))
break;
}
fclose(input);
number_of_workers = i;
}
int main() {
load();
int i, j;
for (i = 0; i < number_of_workers; i++) {
printf("%s %s %d ", arr[i].name, arr[i].surname, arr[i].year);
for (j = 0; j < 5; j++)
printf("%.2f ", arr[i].salary[j]);
printf("\n");
}
return 0;
}
我在屏幕上什么也看不到。你能帮我解决这个问题吗?
这是固定版本。
您在阅读整数和双精度时遗漏了 &
。使用 fscanf,您可以只检查读取的项目数以确定何时到达文件末尾。
每一行都可以在单个 fscanf 调用中读取(如果你想走那条路),不需要双循环。
编辑:作为旁注,对于字符串,您必须小心不要溢出缓冲区。您可以添加 %19s
来限制读取的字符。另外,您可以检查 fopen 的 return 值。
#include <stdio.h>
struct Worker {
char name[20], surname[20];
int year;
double salary[5];
} arr[1000];
int number_of_workers = 0;
void load()
{
FILE *input = fopen("input.txt", "r");
int i = 0;
while (i < 1000 && (fscanf(input, "%s %s %d %lf %lf %lf %lf %lf", arr[i].name, arr[i].surname, &arr[i].year, &arr[i].salary[0], &arr[i].salary[1], &arr[i].salary[2], &arr[i].salary[3], &arr[i].salary[4]) == 8))
{
number_of_workers++;
i++;
}
fclose(input);
}
int main()
{
load();
for (int i = 0; i < number_of_workers; i++)
{
printf("%s %s %d %.2f %.2f %.2f %.2f %.2f", arr[i].name, arr[i].surname, arr[i].year, arr[i].salary[0], arr[i].salary[1], arr[i].salary[2], arr[i].salary[3], arr[i].salary[4]);
printf("\n");
}
return 0;
}
我需要读取文件并将其保存到结构中。
文件输入示例:
Aaaaa Aaaaa 2010 999.00 999.00 999.00 999.00 999.00
Bbbbb Bbbbbbb 2012 1001.00 1001.00 1001.00 1001.00 1001.00
Cccc Ccccccccc 2010 1001.00 1001.00 1001.00 1001.00 1001.00
代码:
#include <stdio.h>
struct Worker {
char name[20], surname[20];
int year;
double salary[5];
} arr[1000];
int number_of_workers = 0;
void load() {
FILE *input = fopen("input.txt", "r");
int i = 0, j;
while (i < 1000) {
fscanf(input, "%s %s %d\n", arr[i].name, arr[i].surname, arr[i].year);
i++;
for (j = 0; j < 5; j++)
fscanf(input, "%d ", arr[i].salary[j]);
if (feof(input))
break;
}
fclose(input);
number_of_workers = i;
}
int main() {
load();
int i, j;
for (i = 0; i < number_of_workers; i++) {
printf("%s %s %d ", arr[i].name, arr[i].surname, arr[i].year);
for (j = 0; j < 5; j++)
printf("%.2f ", arr[i].salary[j]);
printf("\n");
}
return 0;
}
我在屏幕上什么也看不到。你能帮我解决这个问题吗?
这是固定版本。
您在阅读整数和双精度时遗漏了 &
。使用 fscanf,您可以只检查读取的项目数以确定何时到达文件末尾。
每一行都可以在单个 fscanf 调用中读取(如果你想走那条路),不需要双循环。
编辑:作为旁注,对于字符串,您必须小心不要溢出缓冲区。您可以添加 %19s
来限制读取的字符。另外,您可以检查 fopen 的 return 值。
#include <stdio.h>
struct Worker {
char name[20], surname[20];
int year;
double salary[5];
} arr[1000];
int number_of_workers = 0;
void load()
{
FILE *input = fopen("input.txt", "r");
int i = 0;
while (i < 1000 && (fscanf(input, "%s %s %d %lf %lf %lf %lf %lf", arr[i].name, arr[i].surname, &arr[i].year, &arr[i].salary[0], &arr[i].salary[1], &arr[i].salary[2], &arr[i].salary[3], &arr[i].salary[4]) == 8))
{
number_of_workers++;
i++;
}
fclose(input);
}
int main()
{
load();
for (int i = 0; i < number_of_workers; i++)
{
printf("%s %s %d %.2f %.2f %.2f %.2f %.2f", arr[i].name, arr[i].surname, arr[i].year, arr[i].salary[0], arr[i].salary[1], arr[i].salary[2], arr[i].salary[3], arr[i].salary[4]);
printf("\n");
}
return 0;
}