假设我有一个这样的文件:
[inp] // This is the file name
2
1 2 3
5 7 9
这可以使用以下代码在 C++ 中读取:
main()
{
freopen("inp","r",stdin); // Redirect stdin to file, while open the file in read mode
int n; cin >> n; // A variable to get the numbers of lines. n = 2 in this case and the file cursor is after the first line
for (int i = 0; i < n; i++) // n-time loop
{
int a, b, c; // 3 numbers to save 3 values on each line
cin >> a >> b >> c; // Read the numbers from each line. The file cursor after each loop is at the end of a line
doSomething(a, b, c); // Do something with 3 read variables.
}
}
这意味着在C++中,我们可以控制文件光标。我在 bash 中的代码:
inp="./inp" # file name
n=$(head -1 $inp) # Get numbers of line to read
for i in {1..$n}
do
echo * | head -1 $inp | awk '{print $1;}' < $inp
done
我得到的输出不是每行仅得到 1 和 5,而是 3 行上的 2 1 5。所以我认为我们无法在bash中控制文件光标。有什么解决办法吗?
答案1
是的,您可以在 bash 中控制读取文件时的光标,但为此,您需要使用单个文件重定向操作 ( <
),这相当于open()
C/C++ 中的 或 类似操作。
以下是 bash 中的代码,大部分与您提到的 C++ 代码等效:
do_something () {
local linenumber
linenumber=$1
shift
echo "doing something with args $* from line $linenumber"
}
inp="./inp" # file name
{ read numlines
for ((i = 1; i <= numlines; i++)); do
read a b c
do_something "$i" "$a" "$b" "$c"
done
} <"$inp"
如您所见,只有一个<"$inp"
重定向。并且从文件(在本例中为块内)读取的所有命令{ ... }
都共享该文件描述符,包括上次操作后文件留下的光标位置。