我試圖讀取一個文件與1024行,每行9次相同的字母和返回,如果它發現一行不符合這個條款。C函數讀取(文件,緩衝區,字節讀取)打破一個字符串
的文件是如下但1024線:
eeeeeeeee
eeeeeeeee
eeeeeeeee
代碼:
fd = open(fileName, O_RDONLY);
lseek(fd,0,SEEK_SET);
if(flock(fd, LOCK_SH) == -1)
perror("error on file lock");
if(fd != 0){
read(fd, lineFromFile, (sizeof(char)*10));
arguments->charRead = lineFromFile[0];
for(i=0; i < 1024; i++){
var = read(fd, toReadFromFile, (sizeof(char)*10));
if(strncmp(toReadFromFile,lineFromFile,10) != 0 || var < 10){
arguments->result = -1;
printf("%s \n\n",toReadFromFile);
printf("%s \n",lineFromFile);
printf("i %d var %d \n",i,var);
free(toReadFromFile);
free(lineFromFile);
return ;
}
}
}
輸出:
> eeeee
eeee
eeeee
eeee
i 954 var 6
我有5個不同的文件和不同的字母,每個單獨的文件在這個特定的行(954)中給出了這個輸出,並且該行對於最後用\ n書寫了9次的字母是正確的。
任何想法,爲什麼會發生這種情況?如果我不使用lseek它可以正常工作,但我需要lseek將文件分成若干部分,以便通過不同的線程進行測試。我把lseek中的0索引簡化爲向你們展示。
謝謝。
如果你正在嘗試使用'與fgets(讀取由行的文本文件行倒不如讓庫函數做的工作適合你)'或'fscanf()'。而不是使用'fseek()',每個線程可以在它感興趣的人之前簡單地丟棄任何行。另一條路線可以是將整個10k文件(它不是很大,並且你知道它的大小)讀入所有可用的靜態存儲器線程,讓他們都檢查相同的副本。 – 2014-11-14 18:18:42
當您從中讀取文件時,您的其他線程之一是否正在對您的文件執行lseek?你應該把'lseek'移到你鎖定文件的地方。這樣,一旦你鎖定了,你就只能'查看'。 – JS1 2014-11-14 18:20:20
問題是,由於我已經有了使用線程讀取整個文件的其他程序,因此這個新程序需要共享相同的文件才能更快地進行測試,而且我的老師說它必須使用lseek()和read()。我不明白它是如何工作的大部分線路,只是在特定的路線失敗。沒有意義。 – 2014-11-14 18:27:10