我有这个最后的工作项目,我过去几天一直在做,我吓坏了,因为截止日期在这里,我无法找到我的代码有什么问题,我做的一切给了我&#34 ;分段错误"错误,但是当我编译它并没有给我任何错误。 我想要它做的很简单,我有一个文件Navios.txt,(这里有一个navios.txt文件内容的样本:""亚马逊卫报" 0398&# 34;油轮" 72910 1999"希腊"" Sanferu Kaiun"") 这是脚本:
typedef struct{
char nomenavio;
int codigonavio;
char tiponavio;
int tonelagemnavio;
int anonavio;
char paisnavio;
char armadornavio;
}NAVIO;
void listarnavios(FILE*lista, NAVIO*lstNavio){
do{
fscanf(lista,"%c %d %c %d %d %c %c\n", lstNavio->nomenavio, &lstNavio->codigonavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio, &lstNavio->armadornavio);
printf("%c %d %c %d %d %c %c\n", lstNavio->nomenavio, lstNavio->codigonavio, lstNavio->tiponavio, lstNavio->tonelagemnavio, lstNavio->anonavio, lstNavio->armadornavio);
}while(!feof(lista));
}
main(){
NAVIO*lstNavio;
FILE *lista;
lista=fopen("navios.txt", "r+");
if(lista==NULL){
printf("Error");
exit(1);
}
listarnavios(lista, *lstNavio);
}
感谢您的时间和对不起上一篇文章,我第一次使用此论坛。 保持良好的工作:)
答案 0 :(得分:2)
你的文件读取逻辑是错误的 - 每当你看到使用feof()时,你几乎可以肯定。您需要测试fscanf的返回值。
答案 1 :(得分:1)
“亚马逊卫报”不是一个字符,它是一个字符串。你将它指定为%c并传入一个字符。当然,这也是错误的,因为你应该传入指针而不是char。我很惊讶编译器没有警告你。打开-Wall。
答案 2 :(得分:1)
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
typedef struct{
char nomenavio[20];
int codigonavio;
char tiponavio[20];
int tonelagemnavio;
int anonavio;
char paisnavio[20];
char armadornavio[20];
}NAVIO;
void listarnavios(FILE*lista, NAVIO*lstNavio){
do
{
//printf("Scanning...\n");
fscanf(lista,"\"\"%[^\"]\" %d \"%[^\"]\" %d %d \"%[^\"]\" \"%[^\"]\"\"\n", lstNavio->nomenavio, &lstNavio->codigonavio, lstNavio->tiponavio, &lstNavio->tonelagemnavio, &lstNavio->anonavio,lstNavio->paisnavio, lstNavio->armadornavio);
//printf("Printing...\n");
printf("%s %d %s %d %d %s %s\n", lstNavio->nomenavio, lstNavio->codigonavio, lstNavio->tiponavio, lstNavio->tonelagemnavio, lstNavio->anonavio, lstNavio->paisnavio, lstNavio->armadornavio);
}while(!feof(lista));
printf("Done\n");
}
int main(){
NAVIO*lstNavio = malloc(sizeof(NAVIO));
FILE *lista;
lista=fopen("navios.txt", "r+");
if(lista==NULL){
printf("Error");
exit(1);
}
listarnavios(lista, lstNavio);
return 0;
}
这应该可以,只要您提供了正确的文件格式。梅尔建议的fscanf格式有一些小的修正。还进行了一些其他更改以使代码运行。
我不是大师,所以请随意纠正我可能做过的可怕事情。但它运行:))
编辑:注释掉调试打印输出
答案 3 :(得分:0)
main(){
NAVIO*lstNavio;
//...
listarnavios(lista, *lstNavio);
}
看到这个我想知道 - 在使用*lstNavio
之前,它在哪里得到它的价值?
答案 4 :(得分:0)
在main()中,NAVIO * lstNavio;是一个指针,但你永远不会为它分配内存,你将这个未初始化的指针传递给listarnavios()并开始写入内存中的一些随机位置。
将main()更改为此并将osersands添加为osgx建议,它应该可以正常工作。
main(){
NAVIO lstNavio; // <-- stack var instead of pointer
FILE *lista;
lista=fopen("navios.txt", "r+");
if(lista==NULL){
printf("Error");
exit(1);
}
listarnavios(lista, &lstNavio); // <-- pass address of stack var
}
......好吧,这是在您尝试解析的内容中编辑之前。如果您尝试读取完整字符串,其中一些是引号分隔的,则需要重新设计struct和scanf / printf格式。 scanf的简单解析功能无法处理您的输入。
答案 5 :(得分:0)
您尚未为lstNavio分配存储空间,因此它指向无效内存。您需要使用malloc(3)
分配它,或者如John所说,使用堆栈变量。此外,%c是一个字符。 %s匹配非空格字符,因此您的fscanf将无法与%s一起使用。您需要使用:
fscanf("\"[^\"]\" %d \"[^\"]\" %d %d \"[^\"]\" \"[^\"]\"", ...);