c - 文件和字符串
问题描述
我需要制作一个用户选择大陆的程序。该程序将读取所选大陆的文件。然后,程序将询问所选大陆国家的首都。现在,我专注于欧洲。(该文件是西班牙语,但很好)
第一行是国家,第二行是首都,以此类推。我不太擅长这个。当然这是一个愚蠢的错误,或者我误解了这个理论。代码被执行,但以一种奇怪的方式读取文件。这是代码:
#include <stdio.h>
#include <stdlib.h>
#define N 33
int Europa(char EuropaP[N][N], char EuropaC[N][N]);
//int Asia();
FILE *eu;
FILE *as;
int main()
{
int p1, salir;
char EuropaP[N][N];
char EuropaC[N][N];
while(salir != 0)
{
printf("-----MENU PRINCIPAL-----\n"); //main menu where the users selects the continent.
printf("Elige un continente\n\n");
printf("1. Europa\n");
printf("2. Asia\n");
printf("\nEscribe 0 para salir");
printf("\nSeleccion: ");
scanf("%d", &p1);
if (p1 == 1)
{
Europa(EuropaP, EuropaC);
}
else if (p1 == 2)
{
//Asia();
}
else
fclose(eu);
//fclose(as);
break;
}
return 0;
}
int Europa(char EuropaP[N][N], char EuropaC[N][N])
{
int vida, c, i;
eu = fopen("Europa.txt", "r");
if (eu == NULL){
printf("No se ha abierto correctamente el fichero");
}
else
for(i=0; i<33; i++)
{
fscanf(eu, "%s\n%s", EuropaP[i], EuropaC[i]);
}
for(c=0; c<33; c++)
{
printf("%s\n%s", EuropaP[c], EuropaC[c]);
printf("\n");
}
}
执行示例:
如您所见,文件未正确读取。我不知道如何将国家和首都复制到数组中。
问题已解决!我添加了 return 0; 在这里:
if (eu == NULL){
printf("No se ha abierto correctamente el fichero");
return 0;
}
更改了 .txt 文件的目录:
int Europa(char EuropaP[N][N], char EuropaC[N][N])
{
int vida, c, i;
eu = fopen("/Users/****/Desktop/Europa.txt", "r");
最后,我使用 fgets 而不是 fscanf。
else
for(i=0; i<N; i++)
{
fgets(EuropaP[i], N, eu);
fgets(EuropaC[i], N, eu);
}
for(c=0; c<N; c++)
printf("%s\n%s", EuropaP[c], EuropaC[c]);
printf("\n");
解决方案
对于带空格的行,fgets
会起作用。可以使用删除换行符strcspn
。
int Europa(char EuropaP[N][N], char EuropaC[N][N])
{
int vida, c, i;
eu = fopen("Europa.txt", "r");
if (eu == NULL){
printf("No se ha abierto correctamente el fichero");
return 0;
}
for(i=0; i<33; i++)
{
if ( ! fgets ( EuropaP[i], N, eu)) {
printf ( "fgets EOF\n");
return 0;
}
EuropaP[i][strcspn ( EuropaP[i], "\r\n")] = 0;//remove newline
if ( ! fgets ( EuropaC[i], N, eu)) {
printf ( "fgets EOF\n");
return 0;
}
EuropaC[i][strcspn ( EuropaC[i], "\r\n")] = 0;//remove newline
printf("%s\n%s\n", EuropaP[i], EuropaC[i]);
}
return 1;
}
遍历字符串,当找到换行符或回车时,设置零以终止字符串。
int Europa(char EuropaP[N][N], char EuropaC[N][N])
{
int vida, c, i;
int each = 0;
eu = fopen("Europa.txt", "r");
if (eu == NULL){
printf("No se ha abierto correctamente el fichero");
return 0;
}
for(i=0; i<33; i++)
{
if ( ! fgets ( EuropaP[i], N, eu)) {
printf ( "fgets EOF\n");
return 0;
}
each = 0;
while ( EuropaP[i][each]) {
if ( '\r' == EuropaP[i][each] || '\n' == EuropaP[i][each]) {
EuropaP[i][each] = 0;
break;
}
each++;
}
if ( ! fgets ( EuropaC[i], N, eu)) {
printf ( "fgets EOF\n");
return 0;
}
each = 0;
while ( EuropaC[i][each]) {
if ( '\r' == EuropaC[i][each] || '\n' == EuropaC[i][each]) {
EuropaC[i][each] = 0;
break;
}
each++;
}
printf("%s\n%s\n", EuropaP[i], EuropaC[i]);
}
return 1;
}
推荐阅读
- excel - 粘贴后自动替换列中的文本
- wpf - WPF 等效于 jQuery 的类选择器
- django - 依赖登录的Django缓存和页面部分
- laravel - 未找到 Laravel 类 'Illuminate\Support\Facades\Http'
- python - 删除python中的重复记录
- java - 使用 jFreeChart StandardXYItemRenderer 如何设置线条和/或形状可见性
- javascript - 如何允许用户在电子中选择目录?
- flutter - 如何在共享首选项中保存 Firestore 数据,未为“DocumentSnapshot”类型定义运算符“[]”
- python - 如何在 p.terminate() 之后立即获得 p.exitcode=None?
- oracle - 连接到 Oracle XE Docker 容器