반응형
전체 텍스트 파일을 C의 문자 배열로 읽는 중
텍스트 파일의 내용을 C의 문자 배열로 읽고 싶습니다.새 라인을 유지해야 합니다.
어떻게 해야 하나요?저는 웹에서 C++ 솔루션을 찾았지만, C만 있는 솔루션은 없습니다.
편집: 현재 다음 코드가 있습니다.
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;
앱을 실행하면 오류가 발생합니다.
업데이트: 위의 코드가 작동합니다.저는 segfault를 찾았고, 다른 질문을 올렸습니다.도와 주셔서 감사해요.
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);
질문에 답하고 이를 시연하는 완전한 프로그램 형태의 솔루션입니다.다른 답변보다 조금 더 명확하기 때문에 C(IMHO) 경험이 적은 사람들이 이해하기 쉽습니다.
#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;
}
사용한 이후로slurp()
그것이 효과가 있으리라고 기대하고, 며칠 후에 나는 ...라는 것을 알게 되었습니다.그렇지 않습니다.
따라서 "파일의 내용을 문자로 가져오기*에 대한 솔루션을 복사/붙여넣기"하려는 사용자를 위해 다음과 같은 방법을 사용할 수 있습니다.
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;
}
fgets()는 이를 달성하는 데 사용할 수 있는 C 함수입니다.
편집: fread()를 사용하는 것도 고려할 수 있습니다.
xml 파일을 char 버퍼로 읽기 위해 다음 코드를 사용했고 파일 끝에 \0을 추가해야 했습니다.
FILE *fptr;
char *msg;
long length;
size_t read_s = 0;
fptr = fopen("example_test.xml", "rb");
fseek(fptr, 0L, SEEK_END);
length = ftell(fptr);
rewind(fptr);
msg = (char*)malloc((length+1));
read_s = fread(msg, 1, length, fptr);
*(mip_msg+ read_s) = 0;
if (fptr) fclose(fptr);
언급URL : https://stackoverflow.com/questions/3747086/reading-the-whole-text-file-into-a-char-array-in-c
반응형
'programing' 카테고리의 다른 글
오름차순 및 내림차순 정렬에 의한 MYSQL 순서 (0) | 2023.07.28 |
---|---|
PHP에서 2일보다 오래된 모든 파일을 삭제하는 올바른 방법 (0) | 2023.07.28 |
누가 아약스와 휴식의 차이점을 설명해 줄 수 있습니까? (0) | 2023.07.28 |
사용자가 로그인한 후 Larvel 5 세션이 유지되지 않음 (0) | 2023.07.28 |
파이썬 메소드 오버라이드, 서명이 중요합니까? (0) | 2023.07.28 |