带文件输入的 C 内存分配
C memory allocation with File input
你好,内存分配有问题,
1.打开文件
2.取里面的文字长度
3. 使缓冲区的长度为 (array[] ? malloc ?)
4. 对缓冲区中的文本进行操作。
5.关闭
当文本超过 1xx 个字符时它会终止我不知道发生了什么。
ps.注意!我的学习和这段代码的质量可能很差
#include <stdio.h>
#include <stdlib.h>
void copy_to_buffer(FILE *fp, int length, char *buffer){
for(int i = 0; i < length; i++){
char c = fgetc(fp);
buffer[i] = c;
}
}
int length_of_text(FILE *fp) {
fseek(fp, 0L, SEEK_END);
int size = ftell(fp);
rewind(fp);
return size;
}
void char_counter(int length, char *buffer, int *charBuffer) {
int counts[128] = { 0 };
for (int i = 0; i < length; i++) {
counts[(int)(buffer[i])]++;
charBuffer[i] = counts[i];
}
for (int i = 0; i < 128; i++) {
charBuffer[i] = counts[i];
if(counts[i] != 0)
printf("%d.(%c) counted: %d times.\n", i,i, counts[i]);
}
}
/***********************************MAIN***********************************/
int main(int argc, char** argv) {
FILE *fp = fopen("tekst.txt" , "r");
int length = length_of_text(fp); //lenght of text
char *buffer = malloc(sizeof(char)*length); //buffer for text from file
if(buffer == NULL)
printf("error");
else
printf("alocated at = %p\n", &buffer);
int charBuffer[128] = {0}; // charcount buffer
buffer[length] = '[=10=]'; // '[=10=]' after last sign
copy_to_buffer(fp, length, buffer);
char_counter(length, buffer, charBuffer);
free(buffer);
fclose(fp);
return 0;
}
在这一行
charBuffer[i] = counts[i];
当文件大小 >= 128 时,您将溢出 charBuffer[128]
,因为 i
正在索引文件的长度。
在你的char_counter
函数中你做
charBuffer[i] = counts[i];
在第一个 for 循环中,但缓冲区仅定义为 128 个整数。如果文本超过 128 个字符,这将导致缓冲区溢出和分段错误。
删除该行并让第二个 for 循环完成。
你好,内存分配有问题,
-
1.打开文件
-
2.取里面的文字长度
-
3. 使缓冲区的长度为 (array[] ? malloc ?)
-
4. 对缓冲区中的文本进行操作。
-
5.关闭
当文本超过 1xx 个字符时它会终止我不知道发生了什么。
ps.注意!我的学习和这段代码的质量可能很差
#include <stdio.h>
#include <stdlib.h>
void copy_to_buffer(FILE *fp, int length, char *buffer){
for(int i = 0; i < length; i++){
char c = fgetc(fp);
buffer[i] = c;
}
}
int length_of_text(FILE *fp) {
fseek(fp, 0L, SEEK_END);
int size = ftell(fp);
rewind(fp);
return size;
}
void char_counter(int length, char *buffer, int *charBuffer) {
int counts[128] = { 0 };
for (int i = 0; i < length; i++) {
counts[(int)(buffer[i])]++;
charBuffer[i] = counts[i];
}
for (int i = 0; i < 128; i++) {
charBuffer[i] = counts[i];
if(counts[i] != 0)
printf("%d.(%c) counted: %d times.\n", i,i, counts[i]);
}
}
/***********************************MAIN***********************************/
int main(int argc, char** argv) {
FILE *fp = fopen("tekst.txt" , "r");
int length = length_of_text(fp); //lenght of text
char *buffer = malloc(sizeof(char)*length); //buffer for text from file
if(buffer == NULL)
printf("error");
else
printf("alocated at = %p\n", &buffer);
int charBuffer[128] = {0}; // charcount buffer
buffer[length] = '[=10=]'; // '[=10=]' after last sign
copy_to_buffer(fp, length, buffer);
char_counter(length, buffer, charBuffer);
free(buffer);
fclose(fp);
return 0;
}
在这一行
charBuffer[i] = counts[i];
当文件大小 >= 128 时,您将溢出 charBuffer[128]
,因为 i
正在索引文件的长度。
在你的char_counter
函数中你做
charBuffer[i] = counts[i];
在第一个 for 循环中,但缓冲区仅定义为 128 个整数。如果文本超过 128 个字符,这将导致缓冲区溢出和分段错误。
删除该行并让第二个 for 循环完成。