晚上好!我现在的目标只是做些小事,以读取任何类型文件中的字符(并将它们放入字符串中以供以后在程序中使用),但我目前一直遇到一个问题,即我在运行代码及其时“ input [n] =(char)c;”行的分段错误并且我已经尝试通过打印字符和n的值来进行故障排除,并且每次(尽管将我的malloc更改为不同的大小),printf语句都会到达数字“ 134510”的一半,或者将字符打印在偏移量134509之前在下面的行出现故障。我想知道我的问题是什么以及如何解决它,因为对我来说奇怪的是该程序只能通过大约10%的文件。
谢谢!
int c = 0; //Counting the current character being read
int n = 0; //Counting the current character being written
char *input; //A string of all characters in the file
FILE *inputFile; //File to read
if(!(inputFile = fopen(argv[1],"r"))){ // Open in read mode
printf("Could not open file"); // Print and exit if file open error
return 1;
}
input = (char *)malloc(sizeof(inputFile) * sizeof(char));
while (1){ //Put all of the characters from the file into the string
c = fgetc(inputFile);
if(feof(inputFile)){ //If it reaches the end of the file, break the loop
break;
}
printf("%c ", c); //Troubleshooting
input[n] = (char)c;
n++;
}
答案 0 :(得分:3)
问题在于sizeof(inputFile)
不返回文件的大小。它返回FILE*
指针的大小(以字节为单位)。该指针的大小与基础文件的大小完全无关。
答案 1 :(得分:2)
进行段故障的原因是因为以下这一行:
input = (char *)malloc(sizeof(inputFile) * sizeof(char));
malloc分配文件的大小可能看起来不错;但是,您正在获得inputFile POINTER 的大小。这与常规文件完全不同,因为在大多数计算机上指针只有4个字节!
这意味着您仅分配4个字节的数据。
由于您仅尝试读取字符,因此可以简单地进行操作:
while ((int)(result = getline(&line, &capacity, inputs)) != -1)
这将读取整行,您可以将该行放入另一个字符*。
答案 2 :(得分:0)
您不必事先知道文件大小。
您可以使用下面描述的方法: