我正在尝试逐行写入文件,但我无法。它将被附加在同一行中。请帮帮忙。
下面是示例代码:
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
发布于 2018-01-22 00:51:32
不要使用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
。
发布于 2018-01-22 01:08:48
这
open("test.txt", O_RDWR | O_APPEND | O_CREAT,S_IWRITE | S_IREAD)
在附加模式下打开文件,因为flags
包含O_APPEND
。
每 documentation
..。 可使用下列任何组合:
O_APPEND
如果已设置,文件偏移量应在每次写入之前设置为文件的末尾。 ..。
如果要写入以附加模式打开的文件中的特定偏移量,则需要pwrite()
。
pwrite()
函数应该等效于write()
,除非它写入给定的位置,并且不更改文件偏移量(不管是否设置O_APPEND
)。pwrite()
的前三个参数与write()
相同,为文件中所需的位置添加了第四个参数offset
。对无法查找的文件执行pwrite()
的尝试将导致错误。
但是,如果您正在运行Linux, is broken
BUGS POSIX要求使用
O_APPEND
标志打开文件对pwrite()
写入数据的位置没有任何影响。但是,在Linux上,如果一个文件是用O_APPEND
打开的,那么pwrite()
会将数据追加到文件的末尾,而不管offset
的值如何。
https://stackoverflow.com/questions/48373202
复制相似问题