C ошибка, нужна помощь - PullRequest
1 голос
/ 25 мая 2011

У меня есть этот последний рабочий проект, который я выполнял последние дни, и я волнуюсь, потому что крайний срок уже наступил, и я не могу найти, что не так с моим кодом, все, что я делаю, дает мне ошибку "Ошибка сегментации" Однако, когда я компилирую, это не дает мне никакой ошибки. То, что я хочу, это сделать просто, у меня есть файл Navios.txt, (вот пример содержимого файла, присутствующего на navios.txt: "" Amazon Guardian "0398" Tanker "72910 1999" Греция "" Sanferu " Кайун "") Вот сценарий:

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);
}

Спасибо за ваше время и извините за предыдущий пост, мой первый раз, используя этот форум. Продолжайте в том же духе:)

Ответы [ 6 ]

2 голосов
/ 25 мая 2011

Ваша логика чтения файлов неверна - всякий раз, когда вы видите использование feof (), вы можете быть почти в этом уверены.Вам нужно проверить возвращаемое значение fscanf.

1 голос
/ 25 мая 2011
#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, предложенные Мелом. Некоторые другие изменения были также сделаны для запуска кода.

Я не гуру, так что не стесняйтесь исправлять ужасные вещи, которые я мог бы сделать. Но это работает:)

edit: закомментировать распечатку отладки

1 голос
/ 25 мая 2011

«Amazon Guardian» - это не персонаж, а строка. Вы указываете его как% c и переходите в символ. Конечно, это тоже неправильно, так как вы должны передавать указатель, а не символ. Я удивлен, что компилятор не предупредил вас. Включите -Wall.

0 голосов
/ 25 мая 2011

Вы не выделили хранилище для lstNavio, поэтому оно указывает на недопустимую память.Вы должны выделить его, используя malloc(3) или, как сказал Джон, использовать переменную стека.Кроме того,% c - это один символ.% s соответствует не пробелам символов, поэтому ваш fscanf не будет работать с% s.Вам нужно будет использовать:

fscanf("\"[^\"]\" %d \"[^\"]\" %d %d \"[^\"]\" \"[^\"]\"", ...);
0 голосов
/ 25 мая 2011

В main (), NAVIO * lstNavio;является указателем, но вы никогда не выделяете для него память, вы передаете этот неинициализированный указатель в listarnavios () и начинаете запись в какое-то случайное место в памяти.

Измените main () на это и добавьте амперсанды в соответствии с предложением 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
}

... что ж, это было до того, как вы отредактировали содержимое, которое пытаетесь проанализировать.Если вы пытаетесь читать полные строки, некоторые из которых заключены в кавычки, вам нужно будет изменить структуру и форматы scanf / printf.Простые возможности синтаксического анализа scanf не будут обрабатывать ваш ввод.

0 голосов
/ 25 мая 2011
main(){
    NAVIO*lstNavio;
    //... 
    listarnavios(lista, *lstNavio);
}

Видя это, я удивляюсь - перед использованием *lstNavio, где он получает свое значение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...