0

我有下面的简单代码,但是当我在 unix 上使用 GCC 编译和运行时,出现分段错误。是因为文件命名还是将一个文件复制到其他文件。任何帮助表示赞赏..

#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");
}
4

3 回答 3

1

如果 A.txt 不存在,则 ifp 的值为 NULL (0)。然后,此函数调用将发生段错误。

fgetc(ifp)

因此,更改您的代码以检查打开的文件(每个文件)是否为 NULL,例如:

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

您可能还必须在文件顶部添加此包含:

#include <stdlib.h>
于 2013-09-14T16:46:08.430 回答
1

您发布的代码是正确的

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

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

在您使用的那一刻,如果您的当前目录中没有 A.txt 文件,则可能会出现分段错误。

于 2013-09-14T16:35:28.103 回答
0

在参数中使用copy(const char* infile, const char* outfile)以避免不必要的警告。

此外,您的文件可能不在您正在执行代码的当前目录中。所以给你的文件的完整路径。

于 2013-09-14T16:44:14.690 回答