我正在尝试读取包含以下内容的文件hello.ms:
Hello World!
使用此C代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int store_file(char* file_dir, char** buffer)
{
FILE* file;
long lSize;
size_t result;
char* tempBuffer;
file = fopen(file_dir, "r");
if (file==NULL)
{
fputs("File error.", stderr);
exit(1);
}
fseek(file, 0, SEEK_END);
lSize = ftell(file);
rewind(file);
tempBuffer = (char*)malloc(sizeof(char)*lSize);
if (tempBuffer == NULL)
{
fputs("Memory error.", stderr);
exit(2);
}
result = fread(tempBuffer, 1, lSize, file);
if (result != lSize)
{
fputs("Reading error.", stderr);
exit(3);
}
*buffer = tempBuffer;
free(tempBuffer);
fclose(file);
return lSize;
}
void fsa_cycle(char* file_dir)
{
char* buffer;
int bufferSize = store_file(file_dir, &buffer);
fwrite(buffer, sizeof(char), bufferSize, stdout);
}
int main(int argc, char* argv[])
{
if(argc < 2)
{
printf("\nSyntax: %s <file-name>\n\n", argv[0]);
exit(1);
}
fsa_cycle(argv[1]);
return 0;
}
它编译得很好。没有警告或错误。但它只输出rld!
当我向hello.ms文件添加8个空格时,它会读取Hello World!
谁能告诉我为什么会这样?我尝试编写fseek(文件,0,SEEK_CUR)而不是倒带,但这也不起作用。我找不到谷歌的任何帮助,并没有暗示程序员忘记使用fseek来开始。任何帮助都会很棒!
答案 0 :(得分:3)
您正在使用free
释放tempBuffer
内存,但该内存块实际上已分配给buffer
。
free
可能与不同的编译器有所不同,但我的工作与您的一样,只需删除free(tempBuffer);
答案 1 :(得分:2)
您过早释放缓冲区 使用缓冲区后应释放内存。这一行:
fwrite(buffer, sizeof(char), bufferSize, stdout);
答案 2 :(得分:1)
我在gdb中运行它并且在free(tempBuffer)之后出现问题;
(GDB) 31 if(result!= lSize)
(gdb)print tmpBuffer
当前上下文中没有符号“tmpBuffer”。
(gdb)print tempBuffer
$ 3 = 0x602250“Hello World!\ n”
(gdb)n
37 * buffer = tempBuffer;
(gdb)
38 free(tempBuffer);
(gdb)打印缓冲区
$ 4 =(char **)0x7fffffffe180
(gdb)print * buffer
$ 5 = 0x602250“Hello World!\ n”
(gdb)n
39 fclose(file);
(gdb)
41返回lSize;
(gdb)print * buffer
$ 6 = 0x602250“”
(gdb)print tempBuffer
$ 7 = 0x602250“”
答案 3 :(得分:0)
尝试以这种方式使用
char *buff;
buff = calloc(sizeOfFileInBytes + 1, sizeof(char));//replace sizeOfFileInBytes with file size (use stat to get file size)
if (!buff) {
printf("error : %s", strerror(errno));
fclose(f);
}
fread(buff, sizeOfFileInBytes, 1, f);
fclose(f);
printf("%s\n", (char *) buff);//lets echo what we get from fread;
free(buff);//lets return memory to heap