- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个程序来使用 UNIX API 调用来比较两个文本文件。这是我的两个文件的内容:
f1.txt
This is my sample.
It contains text
And for some reason
The last few chars
are duplicated?
f2.txt
This is another sample
Sometimes instead of
duplicating the last few chars,
it prints another new line
instead
4567865
我有一个 cpp 文件可以打开并读取这些文件。我的 OpenRead 函数将文件名作为 c 字符串,并将文本文件的内容放入字符串中并返回它。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
string OpenRead(const char*);
int main(int argc, char **argv)
{
string text1 = "", text2 = "";
string file1(argv[1]);
string file2(argv[2]);
text1 = OpenRead(file1.c_str());
text2 = OpenRead(file2.c_str());
cout << text1 << endl;
cout << text2 << endl;
exit(EXIT_SUCCESS);
return 0;
}
string OpenRead(const char* filename)
{
int inFD1;
string text;
char * buf = new char[fsize(filename)];
inFD1 = open(filename, O_RDONLY, 0);
if(inFD1 < 0) exit(EXIT_FAILURE);
else
{
while (read(inFD1, buf, sizeof(int)) != 0)
text += buf; //cout << buf;
}
close(inFD1);
delete [] buf;
return text;
}
size_t fsize(const char *filename) {
struct stat st;
if (stat(filename, &st) == 0)
return st.st_size;
return -1;
}
问题是,当我将其编译成可执行文件并运行我的命令时:fileComp f1.txt f2.txt,它几乎完美地打开和读取它们,但产生奇怪的输出,其中额外的字符附加到末尾。输出如下所示:
This is my sample.
It contains text
And for some reason
The last few chars
are duplicated?
e
This is another sample
Sometimes instead of
duplicating the last few chars,
it prints another new line
instead
4567865
8
出于某种原因,它在第一个文件上附加了一个 e,在第二个文件上附加了一个 8。此行为因文本文件而异,但它总是将缓冲区中的随机字符附加到末尾。
最佳答案
我看到的主要问题是您没有检查读取结果以了解读取的字符数。
while (read(inFD1, buf, sizeof(int)) != 0)
您要求每次读取 sizeof(int)
字节。但它返回的可能少于此。所以你真的应该拥有那个值(value)。
此外,当向结果 text
添加缓冲区时,您假设缓冲区已经清零(因此您得到默认的空终止符“\0”)
text += buf; //cout << buf;
注意 operator+=
假定 buf 是一个 C 字符串,因此以 null 终止。您没有为您的代码提供该保证。
int len;
while ((len = read(inFD1, buf, sizeof(int))) > 0) {
text.append(buf, len);
}
一旦你开始工作。带到https://codereview.stackexchange.com审查最佳做法。
关于c++ - UNIX API 调用 : Using read() function to open and print a file to the screen adds extra random characters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49060035/
我已经和 Lua 搞了几天,我想出了一些让我三思而后行的事情。 Lua 5.3 的引用手册我还没有看,因为它似乎很复杂,我会尽快查看。 好的,在 lua 5.3 中,我们知道 print() 返回 n
计算时IO (IO ()) , 两个 (IO ())和 ()是计算出来的,所以为什么 main :: IO (IO ()) main = print (print "Hello, World!")
我不太理解从以下位置收到的输出: print(print(print('aaa'))) aaa None None 先aaa清楚了。但我认为第二个 print(aaa) 会抛出一个错误,因为变量 aa
当我运行下面的 Perl one-liner 时,它会打印 1在每一行的前面,我不想要它。它应该做的只是注释匹配 root 的行. $ cat /etc/passwd | perl -ne 'prin
我发现由于 Xcode 将不再消化 println() 我是 留下 Swift.print() 或 print() 。我的问题是, 两者有什么区别?我没能 在网上或在 swift 前卫郎。 (Swif
我正在开发一个内部 Google Chrome 扩展,它需要一种方法来启动将当前页面打印到打印机。我不希望出现默认的打印对话框(因此,javascript:window.print() 是不可能的)。
我正在将 Perl6 Terminal::Print 模块用于基于控制台的应用程序。 它运行良好 - 但是,现在我需要提示用户输入一串文本。 有什么好的方法可以做到这一点? 最佳答案 这是使用 Ter
在学习第三方的Lua代码时,我发现在主脚本文件的顶部 local insert = table.insert local match = string.match local gsub = strin
在学习第三方的Lua代码时,我发现在主脚本文件的顶部 local insert = table.insert local match = string.match local gsub = strin
我目前正在学习 Python,并开始了一个项目,为 2000-2005 年 MLB 摊牌纸牌游戏创建棒球模拟游戏。这些程序包含棒球比赛的事件,作为单独代码段中间的打印语句(“Jeff 击中单打”,“B
我的问题:在没有多余括号的情况下漂亮地打印表达式的最干净的方法是什么? 我有以下 lambda 表达式的表示: Term ::= Fun(String x, Term t) | App(
为了在 Julia 中创建可打印的新类型,应该定义哪些方法?我认为应该只定义 show,然后它将引发其他函数的行为,例如: 打印 字符串 repl_show 显示紧凑 展示 需要为新类型定义以下哪些方
我有一个页面,用户可以在其中打印一些带有图像和数据的 pdf。我希望他们能够打印他们想要的文件数量,并且能够暂停它们——这意味着他们可以停止打印并防止打印尚未发送到打印机的文件;当然,已经发送到打印机
CLHS 说 An attempt to print a circular structure with *print-circle* set to nil may lead to looping
正如标题所示,在 Pycharm 中使用自动完成功能时,显示的唯一自动完成选项是:print(args,kwargs) 内置 我希望自动完成功能以“print”完成,因为这是我通常使用的。我正在使用
是否有可能使用 fmt.Println("...") 打印一个 shell 居中对齐的字符串? 最佳答案 作为对这个长期回答问题的更新,可以通过使用 fmt 包中的 * 符号来改进@miltonb 发
我想在控制台屏幕上显示使用 DO 循环完成的计算进度。我可以像这样将进度变量打印到终端: PROGRAM TextOverWrite_WithLoop IMPLICIT NONE INTEGER ::
我正在尝试为我的新对象定义打印方法,并使用传递给 print 的对象名称。使用 deparse(substitute(y)) .这可以完美地使用 print功能明确: obj function (x
我需要安装 dompdf 方面的帮助。我应该将解压的 zip 文件放在目录中的哪个位置?我按照 INSTALL.txt 进行操作,它显示“将下载的包的内容提取到支持的路径之一”。这是否意味着放入“Mo
我的应用程序中有一个 webkit 小部件,您可以打印它。打印效果很好,除了打印时没有图像,即使屏幕上有图像。 打印代码如下: void MainWindow::printPage() { Q
我是一名优秀的程序员,十分优秀!