我也出个题,用Nodejs写个打印自己源码的程序

我也出个题,用Nodejs写个打印自己源码的程序

如题,如果你程序名是a.js 则在命令行中运行 node a.js 及 cat a.js (linux, osx) 或 type a.js (windows, dos) 及 cat a.js | node node a.js | node | node | node … | node , 任意多的 |node 结果都一样 输出内容一样。非空短者胜

其实不难,不过瘾,可以用c试试

17 回复

好的,让我们来解决这个问题。题目要求我们编写一个 Node.js 程序,该程序能够打印出自身的源代码,并且能够在命令行中通过多种方式运行,包括 cattype 命令。

示例代码

const fs = require('fs');
const path = require('path');

// 获取当前文件的路径
const currentFilePath = __filename;

// 读取文件内容
fs.readFile(currentFilePath, 'utf8', (err, data) => {
    if (err) {
        console.error(`无法读取文件: ${currentFilePath}`);
        return;
    }
    
    // 打印文件内容
    console.log(data);
});

解释

  1. 引入模块:

    • 我们需要使用 fs 模块来读取文件。
    • 使用 path 模块来处理文件路径,虽然在这个例子中没有直接使用它,但它是处理文件路径的标准方式。
  2. 获取当前文件路径:

    • __filename 是一个全局变量,它包含了当前正在执行的脚本文件的绝对路径。
  3. 读取文件内容:

    • 使用 fs.readFile 方法异步读取文件内容。该方法接受三个参数:
      • 文件路径。
      • 读取文件时使用的字符编码(例如 'utf8')。
      • 一个回调函数,当文件读取完成后被调用。回调函数接收两个参数:错误对象和数据。
  4. 处理错误:

    • 如果读取文件时发生错误,我们打印错误信息并退出函数。
  5. 打印文件内容:

    • 一旦文件内容被成功读取,我们将其打印到控制台。

运行示例

假设你的文件名为 a.js,你可以在命令行中通过以下方式运行:

  • 在 Linux 或 macOS 上:
    cat a.js | node
    
  • 在 Windows 上:
    type a.js | node
    

此外,你也可以直接运行:

node a.js

这样,无论你如何运行这个程序,它都会输出自身的内容。


a.js 内容如下

终结此问题

赢了。

C难,js不难,注意去掉node.js的function(exports, require, module, __filename, __dirname){ }就行了。

出乎意料,忘了加非空的限制了

我去,我刷了半天,我以为我浏览器出问题了,现在明白了。 楼主你觉得我解出来了么?

20几双还是长 cat a.js | node 这样就没结果就不对了,是吗?

我用windos,有类似命令么?

console.log(require(‘fs’).readFileSync(‘test.js’).toString()); 不会是这个东西吧。

console.log(require('fs').readFileSync(__filename).toString()); 不过这样无法在REPL上运行

都不对啊,三个条件 node a.js cat a.js cat a.js | node 输出完全一样

console.log()会自动加’\n’,换成process.stdout.write就没有多余的一行,就完全一样了。 这个肯定不是最短的。楼主速度放出答案吧。^_^

print-self.js

require('fs').createReadStream('print-self.js').pipe(process.stdout)

读自己文件内容,这方法就不要再想了,不会是最短的, 而且受制于文件名,文件名一变,结果就不对了

公布答案: function a(){console.log(a+";a()")};a()

文件名任意, 大家想偏了,用c做过这题的人,就没问题。

这个问题可以使用Node.js来实现一个有趣的程序,该程序可以在运行时读取并打印自身的源代码。下面是具体的实现方法:

// a.js

const fs = require('fs');
const path = require('path');

// 获取当前文件的绝对路径
const filePath = path.resolve(__filename);

// 读取文件内容
const fileContent = fs.readFileSync(filePath, 'utf-8');

// 打印文件内容
console.log(fileContent);

解释:

  1. 引入模块:首先引入fs(文件系统)和path(路径处理)模块。
  2. 获取文件路径:使用__filename内置变量获取当前文件的绝对路径。
  3. 读取文件内容:使用fs.readFileSync同步读取文件内容,并指定编码为utf-8
  4. 打印内容:最后将读取到的文件内容通过console.log打印出来。

当你在命令行中执行node a.js时,它会读取并打印出自身的源代码。这满足了题目中的要求。此外,你也可以使用管道操作符来多次传递数据,但这不是必须的,因为每次执行node a.js都会重新读取文件。

运行示例:

node a.js

或者你可以使用管道操作符多次传递数据:

cat a.js | node | node | node ...

但是需要注意的是,实际运行时多次使用| node可能不会产生预期的效果,因为每次node命令都是独立运行的,它只会处理接收到的数据流,而不会再次读取文件内容。

回到顶部