每种编程语言的文件I / O [关闭]


127

这必须是所有程序员不时遇到的一个普遍问题。如何从文本文件中读取一行?然后,下一个问题始终是我该如何写回。

当然,大多数人在日常编程中都使用高级框架(可以很好地用于答案中),但有时也很高兴知道如何在较低级别上进行编程。

我自己知道该怎么做的CC++以及Objective-C,但它肯定会得心应手,看看它是如何在所有流行的语言来完成,如果仅仅是为了帮助我们做出什么语言来做我们的文件IO在一个更好的决定。特别是我认为它看到它在字符串操作语言怎么做,就像将是有趣:pythonruby当然perl

因此,我认为在这里我们可以创建一个社区资源,我们所有人都可以在我们的个人资料中加注星标,并在需要使用某种新语言进行文件I / O时进行引用。更不用说我们都会接触到每天都不使用的语言。

这是您需要回答的方式:

  1. 创建一个名为“ fileio.txt ” 的新文本文件
  2. 将第一行“ hello”写入文本文件。
  3. 将第二行“世界”追加到文本文件。
  4. 将第二行“世界”读入输入字符串。
  5. 将输入字符串打印到控制台。

澄清:

  • 您应该仅针对每个答案展示如何以一种编程语言来执行此操作。
  • 假设该文本文件不存在
  • 编写第一行后,您无需重新打开文本文件

语言没有特别限制。 CC++C#JavaObjective-C都是伟大的。

如果你知道如何做到这一点的PrologHaskellFortranLisp,或Basic则请请便。


9
问题是它不会在搜索特定语言时显示,因为它没有或也没有被每种语言标记。
克里斯·

21
我不明白为什么这个问题已经解决。该网站的目的不是帮助人们查找信息吗?如果某人知道如何在C中做某事(例如IO),并且想学习如何在Python中做同样的事情,则可以允许他们并排看到它们,从而对他们有所帮助。
Slapout

18
我也不明白为什么关闭了它。似乎只是因为它不包含单词“ ...最少的字符...”,这太愚蠢了。打代码高尔夫是一项有趣的运动。但是,使所有的Rosetta-stone问题在所有答案中都变得晦涩难懂,这真的有用吗?
斯潘塞·内尔森

12
我不知道这是如何适合问答网站的:至少对于代码高尔夫而言,对答案进行投票有一个客观的标准:最短或最聪明的答案获得最多的选票。有了这个:是什么,有多少人喜欢Haskell?诸如此类的问题就像试图将所有可能的内容类型塞进一个只为一个设计的系统中。其余互联网处理这有什么问题?

11
为什么这不能很好地工作。没有关于每种方法的优缺点的信息(哪种语言仅支持一种方法?)。没有讨论每种语言的权衡和深层问题。范围有限,这意味着需要一个Bajiliion来单独“使用每种语言”提问。最重要的是,每个答案的质量都不会受到社区的限制。当人们对他们投票时,为什么我不说谦虚?因为每种语言应该只有一个答案,而且人们不会阅读足够的答案来看到他们所在领域的多种选择。
dmckee ---前主持人小猫,2010年

Answers:


48

Python 3

with open('fileio.txt', 'w') as f:
   f.write('hello')
with open('fileio.txt', 'a') as f:
   f.write('\nworld')
with open('fileio.txt') as f:
   s = f.readlines()[1]
print(s)

澄清说明

  • readlines()返回文件中所有行的列表。因此,调用readlines()会导致读取文件的每一行。在这种情况下,最好使用readlines(),因为无论如何我们都必须读取整个文件(我们需要它的最后一行)。但是,如果我们的文件包含很多行,而我们只想打印其第n行,则无需读取整个文件。以下是一些在Python中获取文件第n行的更好方法:用什么替代Python 3中的xreadlines()?

  • 声明是什么?with语句启动一个代码块,您可以在其中使用变量f作为从open()调用返回流对象。当with块结束时,python自动调用f.close()。这保证了无论您以何种方式或何时退出该块,都将在退出with块时关闭文件(即使您通过未处理的异常退出它)。您可以显式调用f.close(),但是如果您的代码引发异常而又没有到达f.close()调用该怎么办?这就是为什么with语句很有用。

  • 您无需在每次操作前重新打开文件。您可以将整个代码编写在带有block的代码中。

    with open('fileio.txt', 'w+') as f:
        f.write('hello')
        f.write('\nworld')
        s = f.readlines()[1]
    print(s)
    

    我使用了三个with块来说明三个操作之间的区别:写入(模式“ w”),附加(模式“ a”),读取(模式“ r”,默认设置)。


19
我真的不认为任何人都不应编写readlines()[1]示例代码。在这种情况下,您可能知道文件只有两行,但是其他人则以为这是一个很好的解决方案,可能会对一百万行的文件进行尝试,并且会感到非常讨厌。
Porculus

14
@Porculus使用readlines()我们不会遍历文件中的所有行。这是python3。readlines()返回一个迭代器(而不是列表)。因此,将仅读取文件的前两行。这类似于python 2中的xreadlines()(在python 3中不存在)。
snakile 2010年

7
@snakile:您能否援引一些支持readlines()返回迭代器(而不是列表)的信息?请注意:您通常无法索引迭代器。
SilentGhost

8
@SilentGhost我引用了“ Dive into Python 3”:“ readlines()方法现在返回一个迭代器,因此它的效率与Python 2中的xreadlines()一样。” 在以下语言中搜索此语句:diveintopython3.org/porting-code-to-python-3-with-2to3.html。其次,在python 3中,您可以为迭代器建立索引。在外壳中键入range(10)[4](range()还返回Python 3中的迭代器,而python 2则range()返回列表)。注意,range(N)[i]是在O(i)中完成的,而不是在O(1)和O(N)中完成的。
snakile 2010年

5
@snakile:您的评论在多个层面上是错误的。首先,readlines返回Python 3中的列表(对其进行测试)。因此,给出的代码将读取整个文件。其次,迭代器无法在Python 2或3 range中建立索引。该对象对索引具有特殊的支持,这在O(1)中完成。
interjay

242

劳尔码

至少可以说规格很粗略,但是我尽力了。让下降的投票开始!:)我仍然觉得它很有趣。

HAI
CAN HAS STDIO?
PLZ OPEN FILE "FILEIO.TXT" ITZ "TehFilez"?
    AWSUM THX
        BTW #There is no standard way to output to files yet...
        VISIBLE "Hello" ON TehFilez
        BTW #There isn't a standard way to append to files either...
        MOAR VISIBLE "World" ON TehFilez
        GIMMEH LINES TehLinez OUTTA TehFilez
        I HAS A SecondLine ITZ 1 IN MAH TehLinez
        VISIBLE SecondLine
    O NOES
        VISIBLE "OH NOES!!!"
KTHXBYE

28
我认为没有其他语言可以让这个属性真正地使我...大声笑。
Ionuț G. Stan 2010年

85
我认为LOLCODE比我所见过的其他东西更具可读性吗?
乔尔2010年

13
让人感觉像是一种自然语言。
Abhinav Sarkar,2010年

19
说您希望被否决是对SO进行投票的保证,因为反向心理学是程序员的反射行为。
布罗克·伍尔夫

13
PLZ?/ AWSUM THX / O NOES非常棒。这对我来说似乎是全能的。
Calvin1602

43

脑***

,------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-],------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]

26
您是否错过了“-”?;)
艾登·贝尔

2
辛苦了 仅作记录,花了多少时间写?
Riduidel

而且您不能将其拆分成多行吗?有史以来最好的语言
TheIronKnuckle

42

科宝

由于没有人做过……

IDENTIFICATION DIVISION.
PROGRAM-ID.  WriteDemo.
AUTHOR.  Mark Mullin.
* Hey, I don't even have a cobol compiler

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT StudentFile ASSIGN TO "STUDENTS.DAT"
        ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD TestFile.
01 TestData.
   02  LineNum        PIC X.
   02  LineText       PIC X(72).

PROCEDURE DIVISION.
Begin.
    OPEN OUTPUT TestFile
    DISPLAY "This language is still around."

    PERFORM GetFileDetails
    PERFORM UNTIL TestData = SPACES
       WRITE TestData 
       PERFORM GetStudentDetails
    END-PERFORM
    CLOSE TestFile
    STOP RUN.

GetFileDetails.
    DISPLAY "Enter - Line number, some text"
    DISPLAY "NXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    ACCEPT  TestData.

2
这应该是投了不下100万次纯迷死+1
布洛克伍尔夫

1
为“该语言仍然存在” +1。= D
missingfaktor,2010年

3
在家尝试时要小心。您的cobol编译器可能不喜欢这些现代的变
长线

是的,这带回了一些生锈的记忆。我认为它不符合要求……
EvilTeach 2010年

我现在正在用AcuCOBOL编写代码!顺便说一句,“ I / O”的“ I”部分在哪里?
Buggabill

39

哈斯克尔

main :: IO ()
main = let filePath = "fileio.txt" in
       do writeFile filePath "hello"
          appendFile filePath "\nworld"
          fileLines <- readFile filePath
          let secondLine = (lines fileLines) !! 1
          putStrLn secondLine

如果您只想读/写文件:

main :: IO ()
main = readFile "somefile.txt" >>= writeFile "someotherfile.txt" 

7
啊,“全能”的哈斯克尔。感谢您的贡献:)
Brock Woolf 2010年

3
@Andreas Rejbrand我几乎可以肯定他忘了一个“是”
Federico klez Culloca

4
一旦完成某些类型的应用程序,Haskell中还有许多其他的基本I / O方法在Haskell中变得有用/重要。cabal / hackage上的文本和字节字符串包使您可以处理各种编码,并且各种iteratee样式的包(例如iteratee和enumerate)代表进行增量io的“最知名的抽象”。同样重要的是解析库,例如parsec和仅attoparsec库的增量字节串。Haskellers已采用非常彻底的方法来探索io设计选择。不可行的示例包括延迟io和延续
Carter Tazio Schonwald

4
裕治:基本上是通过作弊。Haskell是一种纯函数式语言, type 除外IO a,它对副作用有特殊的编译器支持。(由于在执行或观察到副作用的任何东西都是类型的IO a,所以纯度会保留在其他地方,因此类型系统可确保程序的其余部分保持纯净。)
Sam Stokes 2010年

4
碰巧这IO是一个monad,但这不是为什么允许它产生副作用的原因。成为monad就是让您编写命令式语法的原因:它还确保了副作用(还具有特殊语言支持)以合理的顺序发生,因此您在写入文件之前不会从文件中读取内容,依此类推。 。
山姆斯托克斯

35

d

module d_io;

import std.stdio;


void main()
{
    auto f = File("fileio.txt", "w");
    f.writeln("hello");
    f.writeln("world");

    f.open("fileio.txt", "r");
    f.readln;
    auto s = f.readln;
    writeln(s);
}

10
+1,比C ++版本更漂亮,更易读!我梦想有一天D完全取代C和C ++。:-)
missingfaktor

10
真好 也许有一天我应该学习D。
helpermethod 2010年

34

红宝石

PATH = 'fileio.txt'
File.open(PATH, 'w') { |file| file.puts "hello" }
File.open(PATH, 'a') { |file| file.puts "world" }
puts line = File.readlines(PATH).last

2
+1不错,但严格来说,在将输入写入控制台之前,请勿将输入放入变量中。
Lasse Espeholt

3
@lasseespeholt,你是对的。我修好了它。
韦恩·康拉德

5
没有理由大写varname并说“ PATH”。只需说“路径”即可。
OTZ 2010年

2
@otz这是一个常数。不过他本可以将其称为“路径”,而Ruby中的常量只需以大写字母开头。
Sirupsen

1
@Thomas Ahle:File.open与块一起使用时,将打开文件,将其传递到块,然后自动关闭。
Matchu

33

C#

string path = "fileio.txt";
File.WriteAllLines(path, new[] { "hello"}); //Will end it with Environment.NewLine
File.AppendAllText(path, "world");

string secondLine = File.ReadLines(path).ElementAt(1);
Console.WriteLine(secondLine);

File.ReadLines(path).ElementAt(1)仅限于.Net 4.0,替代方法是File.ReadAllLines(path)[1]将整个文件解析为一个数组。


1
它在C#中相当短。感谢您的贡献
Brock Woolf 2010年

13
注意:File.ReadLines特定于.NET 4
kirk.burleson,2010年

5
C#具有令人不愉快的语法
Aiden Bell 2010年

3
@艾登·贝尔:相对于哪种语言?
zfedoran 2010年

2
@Aiden Bell-这个答案试图简洁易读。在C#中,有很多“不错”的方法可以实现相同的目的。有关更实际的示例,请参见dotnetperls.com/file-handling
Dan Diplo

29

ANSI C

#include <stdio.h>
#include <stdlib.h>

int /*ARGSUSED*/
main(char *argv[0], int argc) {
   FILE *file;
   char buf[128];

   if (!(file = fopen("fileio.txt", "w")) {
      perror("couldn't open for writing fileio.txt");
      exit(1);
   }

   fprintf(file, "hello");
   fclose(file);

   if (!(file = fopen("fileio.txt", "a")) {
      perror("couldn't opened for appening fileio.txt");
      exit(1);
   }

   fprintf(file, "\nworld");
   fclose(file);

   if (!(file = fopen("fileio.txt", "r")) {
      perror("couldn't open for reading fileio.txt");
      exit(1);
   }

   fgets(buf, sizeof(buf), file);
   fgets(buf, sizeof(buf), file);

   fclose(file);

   puts(buf);

   return 0;
}

好答案。感谢您为+1
Brock Woolf 2010年

为什么要两次调用fgets()?
kirk.burleson

2
因为第二行是我们要打印到标准输出的行
JeremyP,2010年

1
#include <stdio.h> int main(void){文件文件;char buf [128]; file = fopen(“ fileio.txt”,“ w”); 如果(!file)转到错误; fputs(“ hello \ n”,file); fflush(文件); fputs(“ world \ n”,file); fclose(文件); file = fopen(“ fileio.txt”,“ r”); 如果(!file)转到错误; fgets(buf,sizeof(buf),文件); /跳过'hello' / fgets(buf,sizeof(buf),文件); /获取'word'* / fclose(file); fputs(buf,stdout); 返回0; 错误:fputs(“无法打开文件\ n”,stderr);返回1; }
FelipeC 2010年

原始的C帖子中的代码干净整洁(很多体面的错误检查)(这使长度变长了)。
xagyg

29

Shell脚本(UNIX)

#!/bin/sh
echo "hello" > fileio.txt
echo "world" >> fileio.txt
LINE=`sed -ne2p fileio.txt`
echo $LINE

实际上,该sed -n "2p"部分打印第二行,但问题是要求将第二行存储在变量中,然后再打印,所以... :)


9
我不知道为什么,但是我喜欢这个:)
Federico klez Culloca

当然很重要。好的答案,也感谢您贡献+1
Brock Woolf 2010年

为什么不将标准发送到/ dev / null?
Gumbo,2010年

有一个稍微简单,更快,版本,只用shell内建的(相对于分叉关闭一个单独的进程调用sed),在这里:stackoverflow.com/questions/3538156/...
布赖恩·坎贝尔

@Gumbo,那么您将如何获得第二行? LINE=`foo`将输出捕获foo到变量中LINE
斯特拉格

27

Linux上的x86汇编程序(NASM)

我已经有7年没有接触过asm了,所以我不得不用Google一起破解了,但是仍然有效;)我知道它不是100%正确,但是:D

好的,它不起作用。抱歉,这个。尽管最后确实会打印world,但不会从文件中打印,而是从第ecx27行设置的文件中打印。

section .data
hello db 'hello',10
helloLen equ $-hello
world db 'world',10
worldLen equ $-world
helloFile db 'hello.txt'

section .text
global _start

_start:
mov eax,8
mov ebx,helloFile
mov ecx,00644Q
int 80h

mov ebx,eax

mov eax,4
mov ecx, hello
mov edx, helloLen
int 80h

mov eax,4
mov ecx, world
mov edx, worldLen
int 80h

mov eax,6
int 80h

mov eax,5
mov ebx,helloFile
int 80h

mov eax,3
int 80h

mov eax,4
mov ebx,1
int 80h

xor ebx,ebx
mov eax,1
int 80h

使用的参考:http : //www.cin.ufpe.br/~if817/arquivos/asmtut/quickstart.html

http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html

http://www.digilife.be/quickreferences/QRC/LINUX%20System%20Call%20Quick%20Reference.pdf


您要更正它以使其100%有效吗?如果没有,请删除它,以便可以使用工作版本。
kirk.burleson

4
有趣的是,C语言中的示例应该是一种高级语言,它的使用时间与此......)
Jani Hartikainen

1
@Jani:但是至少它更容易理解。
2010年

起初以为是DOS的:)
mlvljr 2010年

21

JavaScript-node.js

首先,很多嵌套的回调。

var fs   = require("fs");
var sys  = require("sys");
var path = "fileio.txt";

fs.writeFile(path, "hello", function (error) {
    fs.open(path, "a", 0666, function (error, file) {
        fs.write(file, "\nworld", null, "utf-8", function () {
            fs.close(file, function (error) {
                fs.readFile(path, "utf-8", function (error, data) {
                    var lines = data.split("\n");
                    sys.puts(lines[1]);
                });
            });
        });
    });
});

清洁一点:

var writeString = function (string, nextAction) {
    fs.writeFile(path, string, nextAction);
};

var appendString = function (string, nextAction) {
    return function (error, file) {
        fs.open(path, "a", 0666, function (error, file) {
            fs.write(file, string, null, "utf-8", function () {
                fs.close(file, nextAction);
            });
        });
    };
};

var readLine = function (index, nextAction) {
    return function (error) {
        fs.readFile(path, "utf-8", function (error, data) {
            var lines = data.split("\n");
            nextAction(lines[index]);
        });
    };
};

var writeToConsole = function (line) {
    sys.puts(line);
};

writeString("hello", appendString("\nworld", readLine(1, writeToConsole)));

@Ionut:感谢您的许多贡献+1
Brock Woolf 2010年

4
@Dave,不是在浏览器中找到的JS。我的意思是,从语法和语义上讲,这是相同的JS,只是标准库不同。我使用了node.js平台的stdlib 。参见nodejs.org
Ionuț G. Stan,2010年

5
这段代码正在继续。我能听到它的眼泪。
马特

2
行数几乎与楼下ASM解决方案的行数匹配是否可笑?
kizzx2

1
@Matt是的,续集或monad也会在这里有所帮助。
马丁

21

普通口齿不清

(defun main ()
  (with-open-file (s "fileio.txt" :direction :output :if-exists :supersede)
    (format s "hello"))
  (with-open-file (s "fileio.txt" :direction :io :if-exists :append)
    (format s "~%world")
    (file-position s 0)
    (loop repeat 2 for line = (read-line s nil nil) finally (print line))))

1
对于一种叫做“ lisp”的语言,应该包含更多的“ s”字母:)
iwasrobbed

18

电源外壳

sc fileio.txt 'hello'
ac fileio.txt 'world'
$line = (gc fileio.txt)[1]
$line

3
这很干净。是的powershell。
杰伊·巴祖兹

我同意您关于报价的逻辑。我删除它们的原因是,我意识到此脚本实际上是紧凑的,因此我希望它更小-但我们要让它更清楚:)。而且使用gc代替代替是cat有意义的:-) 首先get-alias给了我cat(我不太使用PowerShell)。
Lasse Espeholt

4
该死的,还有什么短的吗?
0fnt 2010年

18

Shell脚本

这是一个仅使用内置命令的shell脚本,而不是调用外部命令(例如sedtail以前的响应已完成)。

#!/bin/sh

echo hello > fileio.txt             # Print "hello" to fileio.txt
echo world >> fileio.txt            # Print "world" to fileio.txt, appending
                                    # to what is already there
{ read input; read input; } < fileio.txt  
                                    # Read the first two lines of fileio.txt,
                                    # storing the second in $input
echo $input                         # Print the contents of $input

在编写重要的Shell脚本时,建议尽可能使用内置命令,因为产生单独的进程可能很慢。通过在我的计算机上进行的快速测试,该sed解决方案比使用慢约20倍read。如果你要打电话sed一次(在这种情况下),实际上并没有多大关系,因为它的执行速度比您注意到的要快,但是如果要执行数百次或数千次,它可以加起来。

对于那些不熟悉的语法,{} 执行命令的列表在当前shell环境(相对于()其创建子外壳;我们需要在当前外壳环境中操作的,所以我们可以在以后使用该变量的值) 。我们需要将命令分组在一起,以使它们都在同一输入流上运行,该输入流是通过从fileio.txt; 重定向而创建的 如果我们简单地运行read < fileio.txt; read input < fileio.txt,我们将得到第一行,因为文件将在两个命令之间关闭并重新打开。由于shell语法的特殊性({并且}是保留字,与元字符相反),我们需要将{and 分开}从其余命令中带空格开始,并以终止命令列表;

read内置带一个参数变量的名字读入。它消耗一行输入,按空格将输入中断(从技术上讲,它根据的内容将其中断$IFS,默认为空格字符,其中空格字符表示将其分割为空格,制表符或换行符),并分配每个单词都按顺序给定变量名称,并将行的其余部分分配给最后一个变量。由于我们只提供一个变量,因此它将整个行放入该变量中。我们重复使用$input变量,因为我们不在乎第一行的内容(如果我们使用的是Bash,我们将无法提供变量名,但是为了便于移植,您必须始终提供至少一个名字)。

请注意,虽然您一次可以读取一行,就像我在这里所做的那样,但更常见的模式是将其包装在while循环中:

while read foo bar baz
do
  process $foo $bar $baz
done < input.txt

3
非常好。我学到了一些(虽然是暂时的)。
Potatoswatter

感谢您的贡献,Brian。
布罗克·伍尔夫

完全病了!用一种好方法:-)
helpermethod 2010年

18

Clojure

(use '[clojure.java.io :only (reader)])

(let [file-name "fileio.txt"]
  (spit file-name "hello")
  (spit file-name "\nworld" :append true)
  (println (second (line-seq (reader file-name)))))

或者等效地,使用线程宏->(也称为paren去除器):

(use '[clojure.java.io :only (reader)])

(let [file-name "fileio.txt"] 
  (spit file-name "hello") 
  (spit file-name "\nworld" :append true) 
  (-> file-name reader line-seq second println))

1
WTF,在过去的50年中,几乎没有人说过Lisp / Scheme摇滚!
Ionuț G. Stan 2010年

11
等等,spit这真的是写文件功能的名称吗?
山姆·斯托克斯

4
Clojure绝对不会摇滚!
kirk.burleson

1
@ [Sam Stokes]内核中有一个名为slurp的函数,该函数将整个文件读入字符串并返回它。吐是完全相反的。有什么问题 还有其他功能,例如line-seq,它们以不同的方式执行相似的操作。
雷恩,2010年

4
当然,@ kirk.burleson比Java更难。:)
Rayne 2010年


16

基本知识

我已经有将近10年没有使用BASIC了,但是这个问题使我有理由快速掌握自己的知识。:)

OPEN "fileio.txt" FOR OUTPUT AS 1
PRINT #1, "hello"
PRINT #1, "world"
CLOSE 1

OPEN "fileio.txt" FOR INPUT AS 1
LINE INPUT #1, A$
LINE INPUT #1, A$
CLOSE 1

PRINT A$

令人惊奇的是,十年后您仍然可以这样做!做得好,感谢您的贡献。
布罗克·伍尔夫

我当然没有动脑筋:花了几分钟来查找一些东西。
卡萨布兰卡2010年

嗯,当然咯。仍然做得很好。
布罗克·伍尔夫

您不需要最经典的BASIC版本中的行号吗?
Yuji 2010年

@Yuji:在“最经典的版本”中,是的,但是我认为自90年代初以来就没有任何版本要求它们。
卡萨布兰卡2010年

16

目标C

NSFileHandle *fh = [NSFileHandle fileHandleForUpdatingAtPath:@"fileio.txt"];

[[NSFileManager defaultManager] createFileAtPath:@"fileio.txt" contents:nil attributes:nil];

[fh writeData:[@"hello" dataUsingEncoding:NSUTF8StringEncoding]];
[fh writeData:[@"\nworld" dataUsingEncoding:NSUTF8StringEncoding]];

NSArray *linesInFile = [[[NSString stringWithContentsOfFile:@"fileio.txt" 
                                             encoding:NSUTF8StringEncoding 
                                                error:nil] stringByStandardizingPath] 
                          componentsSeparatedByString:@"\n"];

NSLog(@"%@", [linesInFile objectAtIndex:1]);

17
我从不喜欢Objective-C。当来自Java之类的语言时,语法似乎是如此陌生。
Faisal Abid

5
Objective-C的秘密是Xcode为您完成所有代码完成。您不必记住长方法名称。它们无疑使您的代码更具可读性
Brock Woolf 2010年

7
而且我认为C ++语法已经看起来很糟糕。
Toad

6
因为Stackoverflow语法荧光笔的颜色不正确,所以Objective-C看起来很糟糕。
布罗克·伍尔夫

4
我简直不敢相信这是如此之低!Java人士还评论说Objective-C丑陋,您看到写入同一文件花了多少行吗?我曾经是Java爱好者,但是我认为Objective-C悄悄地将它带入我的内心。
凯尔(Kyle)2010年

16

佩尔

#!/usr/bin/env perl

use 5.10.0;
use utf8;
use strict;
use autodie;
use warnings qw<  FATAL all     >;
use open     qw< :std  :utf8    >;

use English  qw< -no_match_vars >;

# and the last shall be first
END { close(STDOUT) }

my $filename = "fileio.txt";
my($handle, @lines);

$INPUT_RECORD_SEPARATOR = $OUTPUT_RECORD_SEPARATOR = "\n";

open($handle, ">",  $filename);
print $handle "hello";
close($handle);

open($handle, ">>", $filename);
print $handle "world";
close($handle);

open($handle, "<",  $filename);
chomp(@lines = <$handle>);
close($handle);

print STDOUT $lines[1];

15
关于词法文件句柄,打开3个参数呢?
MkV 2010年

6
非词汇文件句柄绝对不能在堆栈溢出中使用。在实践中很少需要它们,并且不应向初学者证明它们甚至存在。
以太2010年

4
对于两个打开的参数也是如此:永远不要在Stack Overflow上使用它,并且实际上不应该使用它。
rpkelly,2010年

2
我使用3-arg open和lexical文件句柄太多了,因此我几乎将其视为语法错误。应当如此。/ me考虑编写一个模块来实现这一点。
肯特·弗雷德里克

2
是的,“一元开放也有其用途”,它有其用途,但是当我弄清楚它是如何工作的那一天,我感到被虐待,每次见到有人认为他们需要它时,都会“当然有另一种方式”。perl -we 'for (q{ps aux |}){ open _; print <_>; }'
肯特·弗雷德里克

15

R:

cat(“ hello \ n”,file =“ fileio.txt”)
cat(“ world \ n”,file =“ fileio.txt”,append = TRUE)
line2 = readLines(“ fileio.txt”,n = 2)[2]
猫(第2行)

15

的PHP

<?php

$filePath = "fileio.txt";

file_put_contents($filePath, "hello");
file_put_contents($filePath, "\nworld", FILE_APPEND);

$lines = file($filePath);

echo $lines[1];

// closing PHP tags are bad practice in PHP-only files, don't use them

那很棒。感谢您的贡献。
布罗克·伍尔夫

20
或者,您可以采用C实现并添加美元符号。
肯德尔·霍普金斯

@strager我不知道。有些人不知道它是最优的,没有它实际上会更好。
Ionuț G. Stan,2010年

6
万一有人好奇,他之所以不使用结束标签,是因为如果您将其包括在内,并且留下任何尾随空白,则可能会出现“已发送标题”错误。
比尔H


15

爪哇

import java.io.*;
import java.util.*;

class Test {
  public static void  main(String[] args) throws IOException {
    String path = "fileio.txt";
    File file = new File(path);

    //Creates New File...
    try (FileOutputStream fout = new FileOutputStream(file)) {
      fout.write("hello\n".getBytes());
    }

    //Appends To New File...
    try (FileOutputStream fout2 = new FileOutputStream(file,true)) {
      fout2.write("world\n".getBytes());
    }

    //Reading the File...
    try (BufferedReader fin = new BufferedReader(new FileReader(file))) {
      fin.readLine();
      System.out.println(fin.readLine());
    }       
  }
}

36
@Brock:这些天Java并不慢。只是冗长,但不慢。请不要发表这样的评论;伤害我们JVM人。:'|
missingfaktor

9
谁说Java运行缓慢,要么是盲目的Java仇恨者,要么是生活在磐石下。Java可以与平台一样快(即使不比C快),并且具有平台独立性来启动。
NullUserException

4
@Missing Faktor:等等?
杰里·科芬

19
执行速度是程序员最讨厌的小便竞赛形式。总是要选择适合工作的工具,选择诸如执行速度之类的随机指标并为其分配重要的堆只是愚蠢的,特别是因为执行速度对于绝大多数任务而言并不是非常重要,只要它足够快(Java适用于几乎所有事物)
Matt Briggs 2010年

11
“硬接线比机器代码快”,“机器代码比asm快”,“ asm比C快”,“ C比Java快”,“等等等等” ...您甚至还不知道有多少线索机器代码和CPU之间已经存在间接寻址?微代码,预测性优化器,指令/数据缓存,解码器等,更不用说C / asm中动态分配导致的不确定性。Java和其他安全语言只是间接的一小步,这没什么大不了的。您可以永远保持原始状态,也可以与我们一起发展。
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

14

C ++

#include <limits>
#include <string>
#include <fstream>
#include <iostream>

int main() {
    std::fstream file( "fileio.txt",
        std::ios::in | std::ios::out | std::ios::trunc  );
    file.exceptions( std::ios::failbit );   

    file << "hello\n" // << std::endl, not \n, if writing includes flushing
         << "world\n";

    file.seekg( 0 )
        .ignore( std::numeric_limits< std::streamsize >::max(), '\n' );
    std::string input_string;
    std::getline( file, input_string );

    std::cout << input_string << '\n';
}

或稍微不那么花哨

#include <string>
#include <fstream>
#include <iostream>
using namespace std;

int main() {
    fstream file( "fileio.txt", ios::in | ios::out | ios::trunc  );
    file.exceptions( ios::failbit );   

    file << "hello" << endl
         << "world" << endl;

    file.seekg( 0 ).ignore( 10000, '\n' );
    string input_string;
    getline( file, input_string );

    cout << input_string << endl;
}

1
大!感谢您为+1
Brock Woolf 2010年

14
我忘了C ++的语法多么丑陋。
Toad

与大多数C ++代码相比,这残酷的。主要问题是缺乏标准库中定义的适当常量,尽管不是语法。它吹我走,需要包括<limits>只是告诉ignore没有到行大小的限制。
Potatoswatter 2010年

8
@汉斯:你想澄清一下吗?就我个人而言,我认为I / O 属于库而不是语言,并且我
编写的

2
现在我知道Linus为什么说C ++很丑。(无冒犯)
kizzx2 2010年

13

package main

import (
  "os"
  "bufio"
  "log"
)

func main() {
  file, err := os.Open("fileio.txt", os.O_RDWR | os.O_CREATE, 0666)
  if err != nil {
    log.Exit(err)
  }
  defer file.Close()

  _, err = file.Write([]byte("hello\n"))
  if err != nil {
    log.Exit(err)
  }

  _, err = file.Write([]byte("world\n"))
  if err != nil {
    log.Exit(err)
  }

  // seek to the beginning 
  _, err = file.Seek(0,0)
  if err != nil {
    log.Exit(err)
  }

  bfile := bufio.NewReader(file)
  _, err = bfile.ReadBytes('\n')
  if err != nil {
    log.Exit(err)
  }

  line, err := bfile.ReadBytes('\n')
  if err != nil {
    log.Exit(err)
  }

  os.Stdout.Write(line)
}

23
该语言应重命名为“类型”
艾登·贝尔

os.O_RDWR | os.O_CREATE, 0666Go中的基本文件I / O甚至还需要那个垃圾吗?
乔伊·亚当斯

1
也许应该重命名为“停止”
xagyg 2010年

16
令人惊讶的是,经过30年的发展和语言设计,他们仍然设法发明了一种新语言,这种新语言很难像C那样编写错误检查代码。即使Java也不那么冗长!
DK。

5
哇...这个例子似乎失败了
Alessandro Stamatto 2010年

12

Erlang

可能不是最惯用的Erlang,但:

#!/usr/bin/env escript

main(_Args) ->
  Filename = "fileio.txt",
  ok = file:write_file(Filename, "hello\n", [write]),
  ok = file:write_file(Filename, "world\n", [append]),
  {ok, File} = file:open(Filename, [read]),
  {ok, _FirstLine} = file:read_line(File),
  {ok, SecondLine} = file:read_line(File),
  ok = file:close(File),
  io:format(SecondLine).

12

埃马克斯·利斯普(Emacs Lisp)

尽管有人说Emacs主要是文本编辑器[1]。因此,尽管Emacs Lisp可用于解决各种问题,但它已针对文本编辑器的需求进行了优化。由于文本编辑器(显然)在处理文件方面有非常特定的需求,因此会影响Emacs Lisp提供的与文件相关的功能。

基本上,这意味着Emacs Lisp不提供将文件作为流打开并逐部分读取的功能。同样,您必须先加载整个文件才能附加到文件中。而是将文件完全[2]读入缓冲区[3],进行编辑,然后再次保存到文件中。

对于必须执行的任务,您可以使用Emacs Lisp,因为这很合适,并且如果您想执行不涉及编辑相同功能的操作,则可以使用。

如果您想一遍又一遍地添加到文件中,这会带来巨大的开销,但是有可能如此处所示。在实践中,通常在写入文件之前(无论是在下面的示例中组合前两个s表达式),都是通过手动或编程方式完成对缓冲区的更改。

(with-temp-file "file"
  (insert "hello\n"))

(with-temp-file "file"
  (insert-file-contents "file")
  (goto-char (point-max))
  (insert "world\n"))

(with-temp-buffer
  (insert-file-contents "file")
  (next-line)
  (message "%s" (buffer-substring (point) (line-end-position))))

[1]至少我不称其为OS。可选的UI是,OS否。

[2]您只能加载文件的某些部分,但是只能按字节指定。

[3]缓冲区既是某种程度上类似于字符串的数据类型,又是“在编辑文件时看到的内容”。在编辑缓冲区时,窗口中会显示缓冲区,但是缓冲区不一定必须对用户可见。

编辑:如果要查看插入缓冲区的文本,显然必须使其可见,并在两次操作之间休眠。因为Emacs通常仅在等待用户输入时(并且与等待输入不同而休眠)才重新显示屏幕,所以您还必须强制重新显示。在此示例中,这是必需的(代替第二次使用)。实际上,我什至不必使用一次“重新显示”-是的,这很丑,但是...

(with-current-buffer (generate-new-buffer "*demo*")
  (pop-to-buffer (current-buffer))
  (redisplay)
  (sleep-for 1)
  (insert-file-contents "file")
  (redisplay)
  (sleep-for 1)
  (goto-char (point-max))
  (redisplay)
  (sleep-for 1)
  (insert "world\n")
  (redisplay)
  (sleep-for 1)
  (write-file "file"))

1
非常感谢。是否可以增强此功能,所以实际上我看到一个“幽灵”打开文件并键入它,就像某种宏一样?
zedoo 2010年

11

Windows批处理文件-版本2

@echo off
echo hello > fileio.txt
echo world  >> fileio.txt
set /P answer=Insert: 
echo %answer%  >> fileio.txt
for /f "skip=1 tokens=*" %%A in (fileio.txt) do echo %%A

为了解释最后一个可怕的寻找循环,它假定文件中仅存在hello(换行符)世界。因此,它仅跳过第一行,仅回显第二行。

变更日志

  • 2-对,必须误读要求,否则对我有所更改。现在从文件读取最后一行


整齐。感谢您的贡献。
布罗克·伍尔夫

我理解步骤4)是从创建的文件中读取
devio 2010年

@devio-要求必须已更改,或者我只是误读了它们……无论如何,我将看看是否存在这样的解决方案
TheLQ 2010年

11

Scala:

使用标准库:

val path = "fileio.txt"
val fout = new FileWriter(path)
fout write "hello\n"
fout.close()
val fout0 = new FileWriter(path, true)
fout0 write "world\n"
fout0.close() 
val str = Source.fromFile(path).getLines.toSeq(1)
println(str)

使用Josh Suereth的Scala-ARM库

val path = "fileio.txt"
for(fout <- managed(new FileWriter(path))) 
  fout write "hello\n"
for(fout <- managed(new FileWriter(path, true))) 
  fout write "world\n"
val str = Source.fromFile(path).getLines.toSeq(1)
println(str)      


由于许多人使用相同的文件描述符来编写两个字符串,因此我也在回答中包括了这种方式。

使用标准库:

val path = "fileio.txt"
val fout = new FileWriter(path)
fout write "hello\n"
fout write "world\n"
fout.close()
val str = Source.fromFile(path).getLines.toSeq(1)
println(str)

使用Josh Suereth的Scala-ARM库

val path = "fileio.txt"
for(fout <- managed(new FileWriter(path))){
  fout write "hello\n"
  fout write "world\n"
}
val str = Source.fromFile(path).getLines.toSeq(1)
println(str)

我认为使用flush()而不是close()看起来会更好...无需重新实例化FileWriter。
Radtoo

2
@Radtoo:必须显示附加操作。这就是为什么我这样做。
missingfaktor

@Radtoo:在查看了该线程中的其他答案之后,我最终决定在我的答案中包括这种方式。核实。(尽管我没有删除原始代码。)
missingfaktor

@Missing Faktor,getLines().toList()应该是getLines().toSeq哪个懒人?
Elazar Leibovich 2010年

@Elazar:好建议。谢谢。:)
missingfaktor

11

Groovy

new File("fileio.txt").with { 
    write  "hello\n"
    append "world\n"   
    println secondLine = readLines()[1]
}

感谢您的贡献。
布罗克·伍尔夫

3
您在“世界\ n”部分上作弊。它没有附加,只是在写入相同的文件描述符。
OTZ

原始帖子中的第三个说明是“编写第一行后您无需重新打开文本文件”
Wayne Keenan 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.