2013-09-14 4 views
0

У меня есть простой код, но когда я компилирую и запускаю GCC в unix, у меня возникла ошибка сегментации. Это потому, что имя файла или копирование одного файла другим. Любая помощь приветствуется ..ошибка сегментации при копировании файла

#include <iostream> 
#include <stdio.h> 

using namespace std; 

void copy(char *infile, char *outfile) { 
    FILE *ifp; /* file pointer for the input file */ 
    FILE *ofp; /* file pointer for the output file */ 
    int c; /* character read */ 
    /* open i n f i l e for reading */ 
    ifp = fopen (infile , "r"); 
    /* open out f i l e for writing */ 
    ofp = fopen(outfile, "w"); 
    /* copy */ 
    while ((c = fgetc(ifp)) != EOF) /* read a character */ 
     fputc (c, ofp); /* write a character */ 
    /* close the files */ 
    fclose(ifp); 
    fclose(ofp); 
} 

main() 
{ 
copy("A.txt","B.txt"); 
} 
+2

'main' должен возвращать' int', но я не вижу никакой другой проблемы, выскакивающей на меня. Где ваш отладчик говорит об ошибке? Вы проверяли, что 'ifp' и' ofp' являются действительными указателями? –

+0

Это не код на C++ ... –

+0

BTW, ваш код выше на самом деле является языком C, поэтому вам следует удалить «using namespace std» и использовать #include и #include

ответ

1

код, который вы разместили правильно

ifp = fopen (infile , "r"); //will return NULL if file not there 

while ((c = fgetc(ifp)) != EOF)  

Момент, когда вы используете, здесь есть возможность, если вы не имеете a.txt файл в текущем каталоге то вы получите ошибку сегментации.

+1

Эта строка просто вернет 'NULL' нет входного файла. Ошибка произойдет когда-нибудь позже, когда она будет использована. –

+1

@CarlNorum да absolutley правильно. Изменен мой ответ. спасибо за это. – Gangadhar

0

Используйте аргументы copy(const char* infile, const char* outfile), чтобы избежать ненужных предупреждений.

Также ваши файлы могут не быть в текущем каталоге, в котором вы выполняете код. Так что дайте полный путь в свой файл.

+0

спасибо, ребята. Я решил свою проблему. Я только что поставил main и A.txt и B.txt в один файл, и проблема решена. Гангадхар был прав. Я не уверен, но A.txt не были в одном каталоге до того, как я потерял программу, которую я не смог найти сейчас, но я скомпилировал ее с помощью code :: blocks в окнах, а затем перенес ее в среду unix и потому, что основной exe был/bin/debug unde code :: blocks (не тот же каталог с A.txt), что проблема была устранена. Благодарю всех в любом случае – eral

1

IF A.txt не существует, значение ifp будет NULL (0). Затем вызов этой функции будет segfault.

fgetc(ifp) 

Таким образом, измените код для проверки NULL на файл открывается (каждый файл), например:

ifp = fopen (infile , "r"); 
if (ifp == NULL) { 
    printf("Could not open %s\n", infile); 
    exit(-2); 
} 

Вы, возможно, придется добавить к этому относятся также в верхней части файла:

#include <stdlib.h> 
Смежные вопросы