我试图逐行写入文件,但我做不到。它被附加在同一行中。请帮忙。
这里是示例代码:
int main()
{
long filesize;
char sentence[1000];
int count = 5;
int m_iSourceFileData;
int i = 0;
long offset =0;
if ((m_iSourceFileData = open("test.txt", O_RDWR | O_APPEND | O_CREAT,S_IWRITE | S_IREAD)) != -1)
{
while(i != count)
{
if ((lseek(m_iSourceFileData, offset, SEEK_SET)) != -1)
{
printf("Enter a sentence: %d\n", i);
gets(sentence);
filesize = strlen(sentence);
write(m_iSourceFileData, sentence, filesize);
offset += filesize;
printf("Offset is %ld, filesize:%ld\n",offset,filesize);
i++;
}
}
if(m_iSourceFileData != -1)
{
close(m_iSourceFileData);
m_iSourceFileData = -1;
}
}
}
输入
$ a.out
Enter a sentence: 0
write
Offset is 5, filesize:5
Enter a sentence: 1
into
Offset is 9, filesize:4
Enter a sentence: 2
file
Offset is 13, filesize:4
Enter a sentence: 3
line after
Offset is 23, filesize:10
Enter a sentence: 4
line
Offset is 27, filesize:4
输出
writeintofileline afterline
最佳答案
不要使用gets
,它是一个不检查边界的危险函数,
它也从 C11 标准中删除。请改用 fgets
。
gets
返回包含一行的字符串,但它不保存换行符
字符'\n'
。
write(m_iSourceFileData, sentence, filesize);
如果sentence
没有换行符,为什么你会期望在
输出文件? write
忽略了你的意图,它不会附加换行符
因为你想要它。
您有两个选择:
首先(不推荐):向字符串附加换行符:
strcat(sentence, "\n");
filesize = strlen(sentence);
write(m_iSourceFileData, sentence, filesize);
第二(推荐):永远不要使用gets
,而是使用fgets
。 fgets
确实保存换行符(如果有
缓冲区中有足够的空间)。请参阅fgets
.
printf("Enter a sentence: %d\n", i);
fgets(sentence, sizeof sentence, stdin);
filesize = strlen(sentence);
write(m_iSourceFileData, sentence, filesize);
您应该始终检查与交互的函数的返回值
外部世界,如fgets
。您应该始终检查 fgets
是否没有
返回NULL
。
关于c - 使用 lseek 和 write 会导致输入行被附加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48373202/