使用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
答案 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)
)。实际上,你正在设置
fp
到NULL
。由于表达式的计算结果为零,因此不会
出口。相反,程序的其余部分将尝试使用null运行
文件指针。
所有线条的长度是否相同?您似乎正在阅读第一行 在这里找出行长:
int totalLines = getline(&line, &len, fp);
如果第一行包含行数,那么您将对其进行转换
错误。实际上,totalLines
以第一行的长度结束。
您也有内存泄漏,因为传递NULL
告诉getline()
分配缓冲区,你没有释放它。
如果第一行只是一个数据行,则需要rewind()
来读取它
再次为数据。
始终检查malloc()
的返回值以确保其有效。
(不是详尽的清单。)