每当我编译程序时,我都无法运行gcc为我创建的文件

时间:2014-08-29 04:30:50

标签: c file gcc

使用gcc下面的代码创建一个不可执行的文件。此外,当我包含我的sort.h头文件时,我收到一个错误。感谢任何愿意证明阅读我的代码的人。

程序的预期功能是打开提供的文件,然后对其进行排序。

file_sorter.c:

#include <stdio.h>
#include <stdlib.h>
//#include <sort.h>
#include <string.h>

int main(int argc, char **argv){
    if(argc != 2) {
        printf("usage: file_sorter <filename>\n");
        exit (EXIT_FAILURE);
    }
    char *out = "sorted.txt"; //declares the name of output file

    FILE *fp, *fileOUT; //Pointer to sort output data

    fp = fopen(*argv, "r");

    if(fp = NULL){ //checks that the file opened
        exit (EXIT_FAILURE);
    }

    char *line = NULL; //Grabs the total amount of lines from the file
    size_t len = 0;
    int totalLines = getline(&line, &len, fp);

    char **array = (char**)malloc(totalLines * sizeof(char*));
    char singleline[totalLines]; //initial memory allocation for the file

    int i = 0;
    while(fgets(singleline, totalLines, fp) != NULL){
        array[i] = (char*) malloc (totalLines * sizeof(char));
        singleline[totalLines] = '\0';
        strcpy(array[i], singleline);
        i++;
    }//loading the file, and allocating memory as we go

    printf("unsorted file:\n");//prints the unsorted array
    for(i=0; i<totalLines; i++){
        printf("%s\n", array[i]);
    }

    fileOUT = fopen(out, "w");//opens the out file
    if(!fileOUT){
        exit (EXIT_FAILURE);
    }

    printf("sorted file:\n");//prints out the sorted file
    for(i=0; i<totalLines; i++){
        fprintf(fileOUT, "%s", array[i]);
    }

    fclose(fp);//close the files
    fclose(fileOUT);

    for(i=0; i<totalLines; i++){//anti memory leak
        free(array[i]);
    }
    free(array);

    return 0;
}

sort.c:

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

void quick(int *a, int n){
    if(n < 2){
        return;
    }
    int p = a[n /2];
    int *l = a;
    int *r = a + n -1;
    while( l <= r ){
        if( *l < p ){
            l++;
        }
        else if ( *r > p ){
            r--;
        }
        else {
            int t = *l;
            *l = *r;
            *r = t;
            l++;
            r--;
        }
    }
    quick( a, r - a + 1 );
    quick( l, a + n - l );
}

void insertion(int *a, const size_t n) {
    size_t i, j;
    int value;
    for (i = 1; i < n; i++) {
        value = a[i];
        for (j = i; j > 0 && value < a[j - 1]; j--) {
            a[j] = a[j - 1];
        }
        a[j] = value;
    }
}

sort.h:

#ifndef SORT_H
#define SORT_H
#include <stddef.h>

void quick(int *a, int n);
void insertion(int *a, const size_t n);
void readFile(char *a, char *b)

#endif /*SORT_H*/

生成文件:

all: file_sorter.o sort.o
    gcc -Wall -o file_sorter file_sorter.o sort.o

file_sorter.o: file_sorter.c sort.h
    gcc -c file_sorter.c

sort.o: sort.c sort.h
    gcc -c sort.c

clean:
    rm -rf sort *.o

2 个答案:

答案 0 :(得分:1)

您没有打开任何内容(尝试打开调用程序名称除外):

fp = fopen(*argv, "r");

召回*argv argv[0]是呼叫程序名称(即&#39; file_sorter&#39;)。您应该使用argv[1]作为第一个命令行参数。即:

fp = fopen(argv[1], "r");

打开命令行上提供的文件名。修复然后我们将处理其他问题。

答案 1 :(得分:1)

一个错误立即突出:

if(fp = NULL){ //checks that the file opened

那应该是==(或者只是说if (!fp))。实际上,你正在设置 fpNULL。由于表达式的计算结果为零,因此不会 出口。相反,程序的其余部分将尝试使用null运行 文件指针。

所有线条的长度是否相同?您似乎正在阅读第一行 在这里找出行长:

int totalLines = getline(&line, &len, fp);

如果第一行包含行数,那么您将对其进行转换 错误。实际上,totalLines以第一行的长度结束。

您也有内存泄漏,因为传递NULL告诉getline() 分配缓冲区,你没有释放它。

如果第一行只是一个数据行,则需要rewind()来读取它 再次为数据。

始终检查malloc()的返回值以确保其有效。

(不是详尽的清单。)