다음과 같은 파일이 있다고 가정해 보겠습니다.
[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에서 파일을 읽을 때 커서를 제어할 수 있지만 그렇게 하려면 C/C++ <
와 동일하거나 유사한 단일 파일 리디렉션 작업( ) 을 사용해야 합니다 .open()
다음은 언급한 C++ 코드와 거의 동일한 bash의 코드입니다.
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"
리디렉션은 하나만 있습니다. 그리고 파일(이 경우 블록 내)에서 읽는 모든 명령은 { ... }
마지막 작업 후 파일이 남긴 커서 위치를 포함하여 해당 파일 설명자를 공유합니다.