我需要將檔案中的字串加載到結構陣列中。
正確的輸出:
4 Sarajevo,345123 Tuzla,123456 Mostar,101010 Banja Luka,234987我的輸出:
1 Sarajevo 345123 Tuzla 123456 Mostar 101010 Banja Luka 234987,544366964
代碼:
#include <stdio.h>
#include <string.h>
struct City {
char name[31];
int number_of_citizen;
};
int load(struct City cities[100], int n) {
FILE *fp = fopen("cities.txt", "r");
int i = 0;
while (fscanf(fp, "%[^,]s %d\n", cities[i].name, &cities[i].number_of_citizen)) {
i ;
if (i == n)break;
if (feof(fp))break;
}
fclose(fp);
return i;
}
int main() {
int i, number_of_cities;
struct City cities[10];
FILE* fp = fopen("cities.txt", "w");
fputs("Sarajevo 345123", fp); fputc(10, fp);
fputs("Tuzla 123456", fp); fputc(10, fp);
fputs("Mostar 101010", fp); fputc(10, fp);
fputs("Banja Luka 234987", fp);
fclose(fp);
number_of_cities = load(cities, 10);
printf("%d\n", number_of_cities);
for (i = 0; i < number_of_cities; i )
printf("%s,%d\n", cities[i].name, cities[i].number_of_citizen);
return 0;
}
你能解釋一下如何解決這個問題嗎?為什么我的程式只加載了 1 個城市?
uj5u.com熱心網友回復:
fscanf()轉換字串不正確:您"%[^,]s %d\n"應該使用:
while (i < n && fscanf(fp, "0[^,],%d",
cities[i].name,
&cities[i].number_of_citizen) == 2) {
i ;
}
或更好:
#include <errno.h>
#include <stdio.h>
#include <string.h>
int load(struct City cities[], int n) {
char buf[200];
int i = 0;
char ch[2];
FILE *fp = fopen("cities.txt", "r");
if (fp == NULL) {
fprintf(stderr, "cannot open %s: %s\n", "cities.txt",
strerror(errno));
return -1;
}
while (i < n && fgets(buf, sizeof buf, fp)) {
if (sscanf(buf, "0[^,],%d%1[\n]",
cities[i].name,
&cities[i].number_of_citizen, ch) == 3) {
i ;
} else {
fprintf(stderr, "invalid record: %s\n", buf);
}
}
fclose(fp);
return i;
}
還要更改您的main函式以在城市名稱和人口計數之間輸出逗號:
int main() {
int i, number_of_cities;
struct City cities[10];
FILE *fp = fopen("cities.txt", "w");
if (fp) {
fputs("Sarajevo,345123\n", fp);
fputs("Tuzla,123456\n", fp);
fputs("Mostar,101010\n", fp);
fputs("Banja Luka,234987\n", fp);
fclose(fp);
}
number_of_cities = load(cities, 10);
printf("%d\n", number_of_cities);
for (i = 0; i < number_of_cities; i )
printf("%s,%d\n", cities[i].name, cities[i].number_of_citizen);
return 0;
}
編輯:由于資料庫檔案中沒有逗號,您必須使用不同的決議方法:
#include <errno.h>
#include <stdio.h>
#include <string.h>
int load(struct City cities[], int n) {
char buf[200];
int i = 0;
FILE *fp = fopen("cities.txt", "r");
if (fp == NULL) {
fprintf(stderr, "cannot open %s: %s\n", "cities.txt",
strerror(errno));
return -1;
}
while (i < n && fgets(buf, sizeof buf, fp)) {
/* locate the last space */
char *p = strrchr(buf, ' ');
if (p != NULL) {
/* convert it to a comma */
*p = ',';
/* convert the modified line */
if (sscanf(buf, "0[^,],%d",
cities[i].name,
&cities[i].number_of_citizen) == 2) {
i ;
continue;
}
}
fprintf(stderr, "invalid record: %s", buf);
}
fclose(fp);
return i;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/511801.html
標籤:C细绳文件结构文件-io
