我在将文本转换为char数组时遇到了一些麻烦.当我为数组设置静态大小时,它工作正常
char speech[15000];
Run Code Online (Sandbox Code Playgroud)
但这样效率很低,所以我尝试使用calloc.这使它停止工作.数组的大小合适,但没有任何内容写入.这是相关的代码.我究竟做错了什么?
int main() {
FILE* inFile;
int i;
int count = 0;
printf("\nOpening file April_30_1789.txt\n");
inFile = fopen("./speeches/April_30_1789.txt", "r");
if(inFile == NULL) {
printf("Could not find April_30_1789.txt\n");
return -1;
}
char ch;
while((ch = fgetc(inFile) != EOF)) count++;
rewind(inFile);
int size = count;
printf("Size of the array is %d\n", size);
char *speech = (char *)malloc(size*sizeof(char) + 1*sizeof(char));
fscanf(inFile, "%s", speech);
printf("Closing the file.\n");
fclose(inFile);
printf("%s", speech);
printf("\n\nDone\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
目前,这给了我
Opening file April_30_1789.txt
Size of the array is 8617
Closing the file.
Fellow-Citizens
Done
Run Code Online (Sandbox Code Playgroud)
可能重复将整个文本文件读入C中的char数组.
你的问题:fscanf用"%s"格式会读到遇到的第一个空格.
可能的解决方案(为简明起见,省略了错误检查):
#include <stdio.h> /* printf */
#include <stdlib.h> /* fopen, fseek, ... */
char *buffer = NULL;
size_t size = 0;
/* Open your_file in read-only mode */
FILE *fp = fopen("your_file_name", "r");
/* Get the buffer size */
fseek(fp, 0, SEEK_END); /* Go to end of file */
size = ftell(fp); /* How many bytes did we pass ? */
/* Set position of stream to the beginning */
rewind(fp);
/* Allocate the buffer (no need to initialize it with calloc) */
buffer = malloc((size + 1) * sizeof(*buffer)); /* size + 1 byte for the \0 */
/* Read the file into the buffer */
fread(buffer, size, 1, fp); /* Read 1 chunk of size bytes from fp into buffer */
/* NULL-terminate the buffer */
buffer[size] = '\0';
/* Print it ! */
printf("%s\n", buffer);
Run Code Online (Sandbox Code Playgroud)