bash 中的 C++ 文件读取方式

bash 中的 C++ 文件读取方式

假设我有一个这样的文件:

[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"重定向。并且从文件(在本例中为块内)读取的所有命令{ ... }都共享该文件描述符,包括上次操作后文件留下的光标位置。

相关内容