c - 使用 lseek 和 write 会导致输入行被附加

标签 c file-handling

我试图逐行写入文件,但我做不到。它被附加在同一行中。请帮忙。

这里是示例代码:

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,而是使用fgetsfgets 确实保存换行符(如果有 缓冲区中有足够的空间)。请参阅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/

相关文章:

c - 编写系统调用 C ,用垃圾填充文件

c - Fopen 返回 null 除非在那里进行探索?

c++ - 处理文件时出现 fatal error

c++ - 计算Qt中对象的序列化大小

c# - (C#) 使文件读/写线程安全(并考虑性能)

c - Visual Studio 中的嵌套静态库?

c - 通过有效负载以外的方法在 Linux UDP 套接字之间交换任意数据

c++ - 逐行读取文件到变量并循环

c++ - 将指针传递给函数并使用 realloc

perl - 如果不在Perl中关闭文件,它有多严重?