[英]C - Function read(file,buffer,bytes to read) breaking a string
我正在嘗試讀取包含1024行的文件,每行有9倍相同的字母,如果找到的行與此條件不匹配,則返回該文件。
該文件如下,但具有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)中都給出此輸出,該行是正確的,該字母寫了9次,最后帶有\\ n。
任何想法為什么會發生這種情況? 如果我不使用lseek,它可以正常工作,但是我需要lseek將文件分為幾個部分,以通過不同的線程進行測試。 為了簡化起見,我將0索引放在lseek中以示大家。
謝謝。
看起來您正在尋找"eeeee\\neeee"
而不是"eeeeeeeee\\n"
。 這意味着您的文件應該這樣開始:
eeeee
eeeeeeeee
eeeeeeeee
像這樣結束:
eeeeeeeee
eeee
如果文件以這種方式結束:
eeeeeeeee
eeeeeeeee
然后,當您到達最后一行時,它將失敗,因為您只會讀取"eeeee\\n"
而不是"eeeee\\neeee"
。
鑒於您評論中的新信息,我相信問題是您不應該尋求中間的問題(在本例中為342和684)。 您應該尋求預期字符串的偶數倍(例如340和680)。 同樣,第954行也不是問題發生的地方。 它應該是954 + X行,其中X是您要搜索的行。
無論您的程序有任何其他問題,它肯定具有以下特點: read()
函數不能保證讀取請求的全部字節數。 除非遇到錯誤或文件末尾,否則它將至少讀取一個,並且在許多情況下,它會讀取請求的全部字節數,但是即使文件末尾還有足夠的字節數,也要read()
讀取的字節可能少於請求的字節。
強烈建議您考慮使用更高級別的函數的注釋,但是如果由於某種原因您不得不使用read()
則必須注意讀取的字節數少於請求的字節數,並通過讀取其他字節來處理它們進入緩沖區未使用的尾端。 可能多次。
在函數形式中,可能如下所示:
int read_all(int fd, char buf[], int num_to_read) {
int total_read = 0;
int n_read = 0;
while (total_read < num_to_read) {
n_read = read(fd, buf + total_read, num_to_read - total_read);
if (n_read > 0) {
total_read += n_read;
} else {
break;
}
}
return (n_read < 0) ? n_read : total_read;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.