[英]Stripping newlines from fread
我正在使用此代码加载文件,但由于某种原因,似乎也要删除换行符,因此会删除除第一行以外的所有行。
void load_script(char* path) {
FILE* file;
char* script;
int filesize = 0;
file = fopen(path, "r");
// determine file size
fseek(file, 0L, SEEK_END);
filesize = ftell(file);
fseek(file, 0L, SEEK_SET);
// allocate memory
script = malloc(filesize + 1);
// read script
size_t size = fread(script, 1, filesize, file);
script[size] = 0;
printf("Before stripping:\n%s\n", script);
// strip newlines
script[strcspn(script, "\n")] = 0;
printf("After stripping:\n%s\n", script);
fclose(file);
tokenize(script);
}
这是输出:
Before stripping:
line 1
line 2
line 3
After stripping:
line 1
我很想知道从多行字符串中删除换行符的最佳方法。 谢谢。
script[strcspn(script, "\n")] = 0;
这将在第一个换行符之后终止C字符串。 您可能需要遍历字符串,并将\\n'
替换为' '
。
就像是:
// strip newlines
for(size_t i = 0; script[i]; i++)
if (script[i] == '\n') script[i] = ' ';
顺便说一句,您应该使用off_t
(定义了POSIX)来存储文件大小(作为filesize
的类型),而不是int
。 一个int
可能无法容纳文件的大小。
除了l3x提供的解决方案之外,我还应该补充一点,即所使用的方法不可靠:
ftell
可能会失败,并且成功后,仅当以二进制模式打开文件时,其返回值才是文件中的字节数。 对于文本模式,标准不保证可以用作fseek
的参数。 将文件与getc()
一起读入按需重新分配的缓冲区(一次一个块getc()
要可靠得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.