将整个文本文件读入C中的char数组中

我想将文本文件的内容读入C中的char数组中。必须保留新行。

我如何做到这一点? 我在网上find了一些C ++解决scheme,但是没有C ++解决scheme。

编辑:我现在有以下代码:

void *loadfile(char *file, int *size) { FILE *fp; long lSize; char *buffer; fp = fopen ( file , "rb" ); if( !fp ) perror(file),exit(1); fseek( fp , 0L , SEEK_END); lSize = ftell( fp ); rewind( fp ); /* allocate memory for entire content */ buffer = calloc( 1, lSize+1 ); if( !buffer ) fclose(fp),fputs("memory alloc fails",stderr),exit(1); /* copy the file into the buffer */ if( 1!=fread( buffer , lSize, 1 , fp) ) fclose(fp),free(buffer),fputs("entire read fails",stderr),exit(1); /* do your work here, buffer is a string contains the whole text */ size = (int *)lSize; fclose(fp); return buffer; } 

我得到一个警告:警告:赋值使得整型指针没有强制转换。 这在行上size = (int)lSize; 。 如果我运行的应用程序,它segfaults。

更新:上面的代码现在工作。 我find了段错误,我又发了一个问题。 谢谢您的帮助。

 FILE *fp; long lSize; char *buffer; fp = fopen ( "blah.txt" , "rb" ); if( !fp ) perror("blah.txt"),exit(1); fseek( fp , 0L , SEEK_END); lSize = ftell( fp ); rewind( fp ); /* allocate memory for entire content */ buffer = calloc( 1, lSize+1 ); if( !buffer ) fclose(fp),fputs("memory alloc fails",stderr),exit(1); /* copy the file into the buffer */ if( 1!=fread( buffer , lSize, 1 , fp) ) fclose(fp),free(buffer),fputs("entire read fails",stderr),exit(1); /* do your work here, buffer is a string contains the whole text */ fclose(fp); free(buffer); 

一个完整的程序forms的解决scheme,回答问题和演示。 这比其他答案更加明确,因此,对那些在C (IMHO)方面经验较less的人来说更容易理解。

 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> /* * 'slurp' reads the file identified by 'path' into a character buffer * pointed at by 'buf', optionally adding a terminating NUL if * 'add_nul' is true. On success, the size of the file is returned; on * failure, -1 is returned and ERRNO is set by the underlying system * or library call that failed. * * WARNING: 'slurp' malloc()s memory to '*buf' which must be freed by * the caller. */ long slurp(char const* path, char **buf, bool add_nul) { FILE *fp; size_t fsz; long off_end; int rc; /* Open the file */ fp = fopen(path, "rb"); if( NULL == fp ) { return -1L; } /* Seek to the end of the file */ rc = fseek(fp, 0L, SEEK_END); if( 0 != rc ) { return -1L; } /* Byte offset to the end of the file (size) */ if( 0 > (off_end = ftell(fp)) ) { return -1L; } fsz = (size_t)off_end; /* Allocate a buffer to hold the whole file */ *buf = malloc( fsz+(int)add_nul ); if( NULL == *buf ) { return -1L; } /* Rewind file pointer to start of file */ rewind(fp); /* Slurp file into buffer */ if( fsz != fread(*buf, 1, fsz, fp) ) { free(*buf); return -1L; } /* Close the file */ if( EOF == fclose(fp) ) { free(*buf); return -1L; } if( add_nul ) { /* Make sure the buffer is NUL-terminated, just in case */ buf[fsz] = '\0'; } /* Return the file size */ return (long)fsz; } /* * Usage message for demo (in main(), below) */ void usage(void) { fputs("USAGE: ./slurp <filename>\n", stderr); exit(1); } /* * Demonstrates a call to 'slurp'. */ int main(int argc, char *argv[]) { long file_size; char *buf; /* Make sure there is at least one command-line argument */ if( argc < 2 ) { usage(); } /* Try the first command-line argument as a file name */ file_size = slurp(argv[1], &buf, false); /* Bail if we get a negative file size back from slurp() */ if( file_size < 0L ) { perror("File read failed"); usage(); } /* Write to stdout whatever slurp() read in */ (void)fwrite(buf, 1, file_size, stdout); /* Remember to free() memory allocated by slurp() */ free( buf ); return 0; } 

fgets()是一个C函数,可以用来完成这个。

编辑:你也可以考虑使用fread()。

由于我用slurp()期待它的工作,几天后,我发现,….它不。

所以对于那些渴望复制/粘贴解决scheme的人来说:“把文件的内容变成char *”,这里有一些你可以使用的东西。

 char* load_file(char const* path) { char* buffer = 0; long length; FILE * f = fopen (path, "rb"); //was "rb" if (f) { fseek (f, 0, SEEK_END); length = ftell (f); fseek (f, 0, SEEK_SET); buffer = (char*)malloc ((length+1)*sizeof(char)); if (buffer) { fread (buffer, sizeof(char), length, f); } fclose (f); } buffer[length] = '\0'; // for (int i = 0; i < length; i++) { // printf("buffer[%d] == %c\n", i, buffer[i]); // } //printf("buffer = %s\n", buffer); return buffer; }