首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用lines和写导致输入行被追加。

使用lines和写导致输入行被追加。
EN

Stack Overflow用户
提问于 2018-01-22 00:32:14
回答 2查看 712关注 0票数 0

我正在尝试逐行写入文件,但我无法。它将被附加在同一行中。请帮帮忙。

下面是示例代码:

代码语言:javascript
运行
复制
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;
         }
     }
}

输入

代码语言:javascript
运行
复制
$ 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

输出

代码语言:javascript
运行
复制
writeintofileline afterline
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-22 00:51:32

不要使用gets,它是一个不检查边界的危险函数,它也被从C11标准中删除。使用fgets代替。

gets返回一个包含一行的字符串,但是它不保存换行符'\n'

代码语言:javascript
运行
复制
write(m_iSourceFileData, sentence, filesize);

如果sentence没有换行符,为什么要在输出文件中找到换行符呢?write忽略了您的意图,它不会追加换行符,因为您需要它。

你有两个选择:

第一个(不推荐):在字符串中追加一个换行符:

代码语言:javascript
运行
复制
strcat(sentence, "\n");
filesize = strlen(sentence);
write(m_iSourceFileData, sentence, filesize);

第二(推荐):永远不要使用gets,而是使用fgetsfgets确实保存了换行符(如果缓冲区中有足够的空间)。见fgets

代码语言:javascript
运行
复制
printf("Enter a sentence: %d\n", i);
fgets(sentence, sizeof sentence, stdin);
filesize = strlen(sentence);
write(m_iSourceFileData, sentence, filesize);

您应该始终检查与外部世界交互的函数的返回值,比如fgets。您应该始终检查fgets不返回NULL

票数 0
EN

Stack Overflow用户

发布于 2018-01-22 01:08:48

代码语言:javascript
运行
复制
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的值如何。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48373202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档