我打开时出现分段错误

时间:2015-12-13 18:30:32

标签: c file file-io segmentation-fault

我是C文件管理的新手。我的老师想要做一个功课来创建一个从源文件复制到目标文件的功能。我创建但它总是给我错误:分段错误。

void source_to_destination(FILE *source , FILE *destination)
{
    char name_source[10], name_destination[10],line[100];
    memset(line,0,sizeof(line));
    memset(name_source,0,sizeof(name_source));
    memset(name_destination,0,sizeof(name_destination));
    read_name_file(name_source);
    read_name_file(name_destination);

    source = fopen(name_source,"r");
    destination = fopen(name_destination,"w");

    while(fgets(line,sizeof(line),source) != NULL)
    {
        fputs(line,destination);
    }

}

2 个答案:

答案 0 :(得分:1)

将数据从一个文件复制到另一个文件时,首选读写二进制文件。使用面向行的输入函数(如fgetsgetline)进行读取将无法正确读取文件中的所有字符,这有很多原因。文本输出功能也有类似的缺点(例如,尝试写入可打印范围之外的字符或具有ASCII替代意义的字符)

使用freadfwrite以二进制模式从文件读取和写入并不比使用fgetsfputs困难。但是,使用freadfwrite可以避免在文本模式下尝试常规文件复制时固有的陷阱,从而保证数据的正确和准确副本。

如果您知道源文件中只包含文本,那么在文本模式下复制文本没有任何问题。这只意味着你必须编写另一个函数来处理非文本的文件。 (通常您不会根据文件内容看到不同的复制例程)。二进制读取和写入消除了所有这些考虑因素。

以下是filecopy函数的简短示例,它将文件中的所有字节读入缓冲区,然后将缓冲区的内容写入目标文件。 (缓冲读/写通常效率更高,您可以通过调整MAXS轻松调整缓冲区大小。该函数返回成功复制的字节数,-1。仔细看看,如果您有任何问题,请告诉我:

#include <stdio.h>
#include <stdlib.h>

#define MAXS 256

int filecopy (char *source, char *dest);

int main (int argc, char **argv) {

    if (argc < 3) { /* validate 2 arguments given */
        fprintf (stderr, "usage: %s file1 file2\n", argv[0]);
        return 1;
    }

    int filesize = 0;

    if ((filesize = filecopy (argv[1], argv[2])) == -1) {
        fprintf (stderr, "error: filecopy failed.\n");
        return 1;
    }

    printf ("\n copied '%s' -> '%s' ('%d' bytes)\n\n", 
            argv[1], argv[2], filesize);

    return 0;
}

int filecopy (char *source, char *dest)
{
    char *buf = NULL;   /* buffer used to read MAXS bytes from file */
    size_t nbytes = 0;  /* number of bytes read from file */
    size_t idx = 0;     /* file index (length)            */
    FILE *fp = fopen (source, "r"); /* stream pointer     */

    if (!fp) {  /* open source for reading */
        fprintf (stderr, "error: file open failed '%s'.\n", source);
        return -1;
    }

    /* allocate MAXS size read buf initially */
    if (!(buf = calloc (MAXS, sizeof *buf))) {
        fprintf (stderr, "error: virtual memory exhausted.\n");
        return -1;
    }

    /* while data read MAXS *buf from file - realloc for next read */
    while ((nbytes = fread (buf+idx, sizeof *buf, MAXS, fp))) 
    {
        idx += nbytes;              /* update total bytes read */
        if (nbytes < MAXS) break;   /* end-of-file reached */

        /* full read - realloc for next   */
        void *tmp;
        if (!(tmp = realloc (buf, (idx + nbytes) * sizeof *buf))) {
            fprintf (stderr, "error: virtual memory exhausted.\n");
            exit (EXIT_FAILURE);
        }
        buf = tmp;
    }
    fclose (fp);    /* close input stream   */

    if (!(fp = fopen (dest, "w+b"))) { /* open output stream */
        fprintf (stderr, "error: file open failed '%s'.\n", dest);
        exit (EXIT_FAILURE);
    }
    fwrite (buf, sizeof *buf, idx, fp);
    fclose (fp);    /* close output stream  */

    free (buf);
    return (int)idx;
}

<强>编译

gcc -Wall -Wextra -O3 -o bin/filecopy_simple filecopy_simple.c

输入文件(二进制)

-rw-r--r--  1 david david  66672 Nov 19 13:17 acarsout2.bin

使用/输出

$ ./bin/filecopy_simple dat/acarsout2.bin dat/acarsout3.bin

 copied 'dat/acarsout2.bin' -> 'dat/acarsout3.bin' ('66672' bytes)

<强>验证

$ ls -al acarsout[23]*
-rw-r--r--  1 david david  66672 Nov 19 13:17 acarsout2.bin
-rw-r--r--  1 david david  66672 Dec 13 14:51 acarsout3.bin

$ diff dat/acarsout2.bin dat/acarsout3.bin
$

答案 1 :(得分:-1)

以下代码

  1. 干净利落地编译
  2. 执行欲望操作(复制文件)
  3. 执行适当的错误检查
  4. 从命令行获取文件名 您需要修改此项以通过现有功能获取文件名
  5. 总是清理自己,包括关闭打开的文件
  6. 演示如何传递%变量--into--函数

    需要修改子函数原型等 如果要打开子功能中的文件 然后让FILE*关闭它们。

  7. 以下是执行所需操作的建议方法

    main()