我正在使用此代码加载文件,但是出于某种原因,删除换行似乎会移除所有行,但第一行除外。
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
我很想知道从多线字符串中删除换行符的最佳方法。感谢。
答案 0 :(得分:2)
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
可能无法容纳文件大小。
答案 1 :(得分:0)
除了l3x提供的解决方案之外,我还要补充说使用的方法不可靠:
ftell
可能会失败,并且成功后,仅当文件以二进制模式打开时,其返回值才是文件中的字节数。对于文本模式,标准不保证可以将其用作fseek
的参数。使用getc()
将文件读入按需重新分配的缓冲区,一次一个块,这样更可靠。