2014-03-04 80 views
1

我想要做的工作是用「While ... do ... done」循環從文本文件中讀取一行(目前該文件只包含一行,後面會增加行數)。奇怪的是它只能讀取一些文本文件。我的代碼是:爲什麼「While ... do ... done」循環無法讀取文本文件?

...(previous commands to create "myfile.txt")... 
while read -r line 
do 
echo "flag" 
done < "myfile.txt" 

我已經嘗試了一些情況。如果我用手工在當前目錄中創建的另一個文件「test.txt」替換了「myfile.txt」(這個「test.txt」也包含一行),我的腳本可以打印「flag」。同樣,在創建「myfile.txt」之後,如果我修改並將其保存在當前目錄中,然後運行我的腳本,它通常也可以打印「標誌」。

除上述兩種情況外,其他情況下我的腳本不能打印「標誌」。 我也嘗試在我的腳本中「chmod」和「touch」文本文件,就像下面這樣,它也無法工作。

顯然,我希望我的腳本能夠讀取文本文件的行,是否有人可以告訴我原因並提供解決方案?

順便說一下,這個文件可以通過cat命令讀取。

...(previous commands to create "myfile.txt")... 
chmod 777 "myfile.txt" 
touch "myfile.txt" 
cat "myfile.txt" #(I can see the results of this line) 
while read -r line 
do 
echo "flag" 
done < "myfile.txt" 

謝謝!

創建文本文件的整個代碼大約是800行。但是,我想發佈創建我的文本文件的行。他們是:

for(i = 1, i<=6, ++i){ 
    ... 
    ofstream myfile("myfile.txt", std::ios_base::app); 
    ... 
    if(myfile.is_open()){ 
     myfile << "rms_" << std::setprecision(3) << RMS_values ; 
     myfile.close(); 
    } 
    } 

****************我的解決方案開始******************* *********************

感謝上述回覆。

我已經通過我和這個鏈接解決:https://unix.stackexchange.com/questions/31807/what-does-the-noeol-indicator-at-the-bottom-of-a-vim-edit-session-mean

的原因是我生產的文本文件的腳本,沒有「\ n」結尾。因此,在VI中打開文本文件後,文本文件具有「[noeol]」圖標。

根據上述鏈接,如果沒有「[noeol]」,UNIX/LINUX將不會讀取此文件。

解決方法很簡單(看後),只需在「cout」結尾添加「< <」\ n「」即可。該線變爲,

myfile << "rms_" << std::setprecision(3) << RMS_values << "\n"; 

****************我的解決方案結束******************* *********************

+0

我不知道'bash'scripting,但我想也許在你創建文件後,緩衝區沒有被刷新,所以文件沒有完全寫入 – Zaiborg

+4

你的腳本對我來說工作正常 - 你如何創建文件? –

+0

@Zaiborg:文件只能在單個進程中不能刷新。由於每個shell命令都是獨立的進程,這不是一個問題。 –

回答

0

我真的不明白你的問題 - 你能告訴我們更多的代碼/你如何創建文件?

這裏是一個工作示例:

$ cat readfile.sh 
#!/bin/bash 

{ 
     cat <<EOT 
this 
is 
a 
test 
file 
EOT 
} > ./test.txt 

while read -r line; do 
     echo "line = [${line}]" 
done <./test.txt 

$ ./readfile.sh 
line = [this] 
line = [is] 
line = [a] 
line = [test] 
line = [file] 
1

$cat test.sh

#!/bnin/bash 
echo "content" > "myfile.txt" 
cat "myfile.txt" #(I can see the results of this line) 
while read -r line 
do 
echo "flag" 
done < "myfile.txt" 

$bash test.sh

content 
flag 

$

它有效。它沒有問題。由於while循環在文件中每行打印一條消息,因此如果沒有行(並且touch不會添加任何),則(該腳本是您發佈內容的精確副本,除了觸摸被替換爲某些內容)它顯然不會打印任何東西。

1

我在這裏採取了猜測:

在Unix中,兩個假設都是關於文本文件提出:

  • 的所有行<LF>字符結束。如果您在使用<CR>的舊式Mac上編輯文件,Unix將不會看到行結尾。如果您在Windows程序(如Notepad.exe)上編輯文件,則您的行將以<CR><LF>結尾,Unix會認爲<CR>是該行的一部分。
  • 所有行必須以<LF>結尾,包括最後一行。如果使用C程序編寫程序,最後一行可能不會以<LF>結尾,除非您專門寫出它。

awkgrep這樣的Unix公用程序和shell在這些假設下生活和呼吸。當有人通常會在使用shell腳本讀取文件時告訴我一些不太適用的操作時,我告訴他們在VIM中編輯該文件,然後保存它(因此強制結束<LF>字符)。在VIM中,您需要:set ff=unix然後保存。這通常會解決這個問題。

我的猜測是,您正在閱讀的文件沒有正確的行結尾,並且/或者最後一行在末尾沒有<LF>字符。

+0

我的情況正如你所猜測的。請參閱上面我的帖子的最後部分。 – user2740039

+0

@ user2740039那就別忘了接受David的回答! :-) –