C程序在执行后挂起

时间:2014-10-16 14:30:05

标签: c freeze hang

我是C编程的新手。我做了一个非常短的程序来合并文件夹中的所有文件。 该程序运行并产生正确的输出,但在执行后它挂起,我必须手动杀死它。 有什么想法吗?

此处的重要功能是scandirappend_to_file

/*
MERGE: Merges text files. Gives the ability to merge a list of files or all files in a 
directory with specified extension.
*/
#include <stdio.h>
#include <dirent.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>

/* Function prototypes */
int append_to_file(const char *filename, const char *outfilename); // Appends the contents of filename to outfilename
int scandir(char dirname[], char const *ext, char outfile[]); // Scans a directory for files of a specific extension and merges them
bool has_extension(char const *name, char const *ext);
void usage(); // Prints out usage information (help) to the console
void path_combine(char *dest, const char *path1, const char *path2); // Combines a directory name and filename to a single filepath

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

    int i, // Counters
        nfiles; // Number of files merged

    if (argc == 4)
    {
        nfiles = scandir(argv[1], argv[2], argv[3]);      
        printf("Merged %s files\n", nfiles);

        return 0;  
    }
    else
    {
        printf("Wrong input, quitting");
        return 1;
    }

}

int append_to_file(const char *filename, const char *outfilename)
{
    FILE *infile, *outfile;
    char ch;
    infile = fopen(filename, "r");
    outfile = fopen(outfilename, "a");

    if (infile == NULL)
    {
        printf("Input file is empty, skipping...\n");
        return 1;
    }

    while ((ch = fgetc(infile)) != EOF)
        fputc(ch, outfile);

    fclose(infile);
    fclose(outfile);

    return 0;

}

int scandir(char dirname[], char const *ext, char outfile[])
/* Scans a directory and merges all files of given extension */
{
    DIR *d = NULL;
    struct dirent *dir = NULL;
    char filepath[strlen(dirname) + 255];
    int i = 0;   

    d = opendir(dirname);

    if (d)
    {
        while ((dir = readdir(d)) != NULL)
        {   
            if (has_extension(dir->d_name, ext))
            {   

                path_combine(filepath, dirname, dir->d_name);
                printf("%s\n", filepath);
                append_to_file(filepath, outfile);
                i++;
            }

        }
        closedir(d);
    }
    return i;
}


bool has_extension(char const *name, char const *ext)
{
    size_t len = strlen(name);
    return len > 4 && strcmp(name+len-4, ext) == 0;
}


void path_combine(char *dest, const char *path1, const char *path2)
{
    const char *last_char = path1;
    int append_sep = 0;
    char sep[] = "/";

#ifdef WIN32
    sep[0] = '\\';
#endif

    /* Find the last character in the first path*/
    while(*last_char != '\0')
        last_char++;

    /* If the last character is not a seperator, we must add it*/
    if (strcmp(last_char, sep) !=0)
    {
        append_sep = 1;
    }

    strcpy(dest, path1);
    if (append_sep)
        strcat(dest, sep);
    strcat(dest, path2);       

}


void usage()
{
    printf("\t=================\n");
    printf("\t      MERGE\n");
    printf("\t=================\n");
    printf("Merge two or more text files\n");
    printf("Usage:\n");
    printf("\tCall merge with a directory name and desired extension:\n");
    printf("\tmerge DIRNAME .csv OUTPUTFILE\n\n");

};

2 个答案:

答案 0 :(得分:2)

当编译器警告您(如果使用gcc -Wall -g进行编译时),请执行以下行:

    printf("Merged %s files\n", nfiles);

错误,因为nfilesint。你可能想要

    printf("Merged %d files\n", nfiles);

了解undefined behavior。你有一个。从printf(3)&amp;开始,仔细阅读您正在使用的每个功能的文档。 fopen(3)&amp; perror(3)&amp; exit(3)。不要忘记处理失败,例如:

FILE *infile, *outfile;
char ch;
infile = fopen(filename, "r");
outfile = fopen(outfilename, "a");

if (infile == NULL) {
    printf("failed to open %s (%s), skipping...\n", 
           filename, strerror(errno));
    return 1;
}
if (outfile == NULL) {
    perror(outfilename);
    exit(EXIT_FAILURE);
}

了解如何使用调试器(gdb)。如果在Linux上,也请使用strace(1)valgrind

答案 1 :(得分:-1)

阿。 我以为我在使用调试器,在编译时指定-g

gcc main.c -g -o main.exe

但它仍悬而未决。

如果我添加了标记-Wall-Werror,很快就会告诉我格式化错误。

行[{1}}需要更改为printf("Merged %s files\n", nfiles)

使用-Wall和-Werror进行编译很快就指出了这个错误。